Skip to main content

list manipulation - Composition with Transpose failure with Dataset


Is the failure of the 2nd Transpose here a known bug?


Dataset[{{0, 10}, {2, 11}, {3, 12}}][
Transpose /* Map[MinMax] /* Transpose] // Normal



Failure[Transpose, {"MessageTemplate" :> Transpose::nmtx, 
"MessageParameters" -> {{__}, Transpose}}]

Similarly for


Dataset[{{0, 10}, {2, 11}, {3, 12}}][
Query[Transpose /* Map[MinMax]] /* Transpose]

For both of these, without the Normal, the error msg is: "The first two levels of {__} cannot be transposed".


Yet the seeming equivalent query, albeit with an intermediate Dataset, works:



Dataset[{{0, 10}, {2, 11}, {3, 12}}][Transpose /* Map[MinMax] ][
Transpose]// Normal

And without Dataset, this works also:


{{0, 10}, {2, 11}, {3, 12}} // Transpose // Map[MinMax] // Transpose


{{0, 10}, {3, 12}}




Answer




The problem is due to two factors:



  1. The type system cannot infer the data type that results from a call to MinMax.

  2. A type-checked application of the Transpose query operator will fail when applied to an argument with an unknown type (i.e. from MinMax).


I think that point #1 could be considered a bug, although the fact of the matter is that a great many operators are not (yet) known to the type system. Given these omissions, it might be reasonable to expect the Transpose operator to be more forgiving.


Analysis (current as of version 11.0.1)


When an operation succeeds outside of a Dataset but fails within, the cause is usually a type-inferencing failure. That is indeed the case here.


traceTypes will reveal the failure:


traceTypes[Dataset[{{0, 10}, {2, 11}, {3, 12}}]][Transpose /* Map[MinMax] /* Transpose]


traceTypes screenshot


We can see that the type machinery cannot infer the resultant type of applying MinMax to a list of integers:


Needs["TypeSystem`"]
TypeApply[MinMax, {Vector[Atom[Integer], 3]}]
(* UnknownType *)

Furthermore, a type-checked application of AssociationTranspose (the query-form of Transpose) will not accept a vector of unknown type:


Needs["GeneralUtilities`"]
TypeApply[AssociationTranspose, {Vector[UnknownType, 2]}]

(* FailureType[{Transpose, "nmtx"}, <|"Arguments" -> {__}|>] *)

This last failure is the source of the message we see.


Work-around


As noted in the question, a work-around is to perform the final Transpose in a second query:


Dataset[{{0, 10}, {2, 11}, {3, 12}}][Transpose /* Map[MinMax]][Transpose]

double-query dataset screenshot


When the final query result is wrapped back into a dataset, type deduction takes place which is more reliable than type inferencing. By splitting our query in two, we allow such type deduction to take place so that the final Transpose operator can be applied to a known type:


Needs["Dataset`"]

Dataset[{{0, 10}, {2, 11}, {3, 12}}][Transpose /* Map[MinMax]] // GetType
(* Vector[Vector[Atom[Integer], 2], 2] *)

TypeApply[AssociationTranspose, {Vector[Vector[Atom[Integer], 2], 2]}]
(* Vector[Vector[Atom[Integer], 2], 2] *)

Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

equation solving - Invert and fit implicitly defined curve

I need to fit an implicitly defined curve. I thought I could get some data out of Solve , and then using FindFit . Therefore, I would like to find the relation the parametric curve defined by $F(x,y)=0$: Solve[-(1/2) + 1/2 (0.41202 BesselK[0, 0.1 Sqrt[x^2 + y^2]] + (0.101483 x BesselK[1, 0.1 Sqrt[x^2 + y^2]])/Sqrt[x^2 + y^2]) == 0, y] But I can't get an output: Solve was unable to solve the system with inexact coefficients or the system obtained by direct rationalization of inexact numbers present in the system. Since many of the methods used by Solve require exact input, providing Solve with an exact version of the system may help. >> Edit: In particular, I would like to fit the data coming from the curve with the expression of another curve, and not with a function $f(x)$. In particular, since this clearly looks like a cardioid , I would like it to fit to something like it. What other strategies could I try?

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...