如何用ndim == 0和size == 0创建ndarray?

时间:2015-01-29 11:19:25

标签: python numpy

我正在测试我的程序的一些边缘情况,并观察到一个奇怪的事实。当我创建一个标量numpy数组时,它有size==1ndim==0

>>> A=np.array(1.0)
>>> A.ndim  # returns 0
>>> A.size  # returns 1

但是当我创建没有元素的空数组时,它有size==0ndim==1

>>> A=np.array([])
>>> A.ndim  # returns 1
>>> A.size  # returns 0

为什么?我希望ndim也是0。还是有另一种方式来创造真正的' sizendim等于0的空数组?

更新:偶A=np.empty(shape=None)不会创建大小为0的无量纲数组...

1 个答案:

答案 0 :(得分:1)

我相信答案是"不,您无法创建ndarrayndimsize为零"。正如您自己已经发现的那样,(ndim,size) (1,0)(0,1)array(1)尽可能低。

This very nice answer解释了很多关于numpy标量类型,以及为什么它们有点奇怪。这个解释清楚地表明像size==1这样的标量numpy数组是一种非常特殊的野兽。它们只有一个值(导致ndim==0),但根据定义,它们没有维度感,因此ndim。另一方面,非标量numpy数组可以为空,但它们至少包含一对方括号,导致最小size为1,即使它们的ndarray可以为0它们由空列表组成。 (这就是我对这种情况的看法:np.array()以某种方式列出了......的列表列表,其数量与维度一样多.1d数组与列表兼容,因此列表,仍然是列表,也有一个定义维度。)

提出空标量的唯一方法是像这样调用module MUX_8_1 (i0 ,i1 ,i2 ,i3 ,i4 ,i5 ,i6 ,i7 , selectors , o_8 ); input [31:0] i0 ,i1 ,i2 ,i3 ,i4 ,i5 ,i6 ,i7; input [2:0] selectors ; output [31:0] o_8 ; wire [31:0] o_0; wire [31:0] o_1; wire [31:0] o_2; wire [31:0] o_3; wire [31:0] o_4; wire [31:0] o_5; MUX_2_1 M1(.i0 (i0), .i1 (i1), .sel (selectors[0]),.o (o_0)); MUX_2_1 M2(.i0 (i2), .i1 (i3), .sel (selectors[0]),.o (o_1)); MUX_2_1 M3(.i0 (i4), .i1 (i5), .sel (selectors[0]),.o (o_2)); MUX_2_1 M4(.i0 (i6), .i1 (i7), .sel (selectors[0]),.o (o_3)); MUX_2_1 M5(.i0 (o_0), .i1 (o_1), .sel (selectors[1]),.o (o_4)); MUX_2_1 M6(.i0 (o_2), .i1 (o_3), .sel (selectors[1]),.o (o_5)); MUX_2_1 M7(.i0 (o_4), .i1 (o_5), .sel (selectors[2]),.o (o_8)); endmodule module MUX_2_1 (i0 ,i1 ,sel ,o); input [31:0] i0 ,i1; input sel ; output [31:0] o; assign #19 o = (i0 & (~sel)) | (i1 & sel); endmodule` ,但数组只能由一些实际对象初始化。因此,我相信您的程序可以避免这种边缘情况。