我正在测试我的程序的一些边缘情况,并观察到一个奇怪的事实。当我创建一个标量numpy数组时,它有size==1
和ndim==0
。
>>> A=np.array(1.0)
>>> A.ndim # returns 0
>>> A.size # returns 1
但是当我创建没有元素的空数组时,它有size==0
但ndim==1
。
>>> A=np.array([])
>>> A.ndim # returns 1
>>> A.size # returns 0
为什么?我希望ndim
也是0
。还是有另一种方式来创造真正的' size
和ndim
等于0
的空数组?
更新:偶A=np.empty(shape=None)
不会创建大小为0的无量纲数组...
答案 0 :(得分:1)
我相信答案是"不,您无法创建ndarray
,ndim
和size
为零"。正如您自己已经发现的那样,(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`
,但数组只能由一些实际对象初始化。因此,我相信您的程序可以避免这种边缘情况。