不要只看形状;检查 dtype,如果是对象,则检查元素的性质
In [282]: np.array([[], [], []])
Out[282]: array([], shape=(3, 0), dtype=float64)
二维浮点数数组。np.array
尝试创建一个多维数字数组;只有当它无法做到这一点时,它才会创建一个对象数组。
In [283]: b=np.array([[],[3],[]])
In [284]: b
Out[284]: array([[], [3], []], dtype=object)
这里的3个子列表有不同的大小,所以它不能组成一个二维数组;结果是一个对象数组,其中对象是列表,并且具有append 方法。
In [286]: c=np.array((3,0), object)
In [287]: c
Out[287]: array([3, 0], dtype=object)
这是一个 (2,) 对象数组; 2 个元素是数字。数字没有附加方法。
In [288]: np.empty((3,1))
Out[288]:
array([[ 0.],
[ 0.],
[ 0.]])
一个 (3,1) 浮点数数组。没有数字或数组的附加方法。
In [289]: np.empty((3,0))
Out[289]: array([], shape=(3, 0), dtype=float64)
另一个二维浮点数数组
In [290]: np.empty((6,1),object)
Out[290]:
array([[None],
[None],
[None],
[None],
[None],
[None]], dtype=object)
dtype 对象的二维数组。在这种情况下,它们被初始化为None
。再次没有附加方法。
有关创建列表数组的更多信息
numpy 中数组数组的维度
and
创建不同形状数组的对象数组时如何防止 numpy 广播
In [305]: d=np.empty((3,),object)
In [306]: d
Out[306]: array([None, None, None], dtype=object)
In [307]: d.fill([])
In [308]: d
Out[308]: array([[], [], []], dtype=object) # array of lists
In [309]: d[0].append([1,2,3])
In [310]: d
Out[310]: array([[[1, 2, 3]], [[1, 2, 3]], [[1, 2, 3]]], dtype=object)
但是哎呀 - 这些列表都是相同的对象(指针):( 我必须在每个元素中放置不同的列表。现在我可以单独附加到它们。
In [311]: d[...]=[[],[1,2,3],[2]]
In [312]: d
Out[312]: array([[], [1, 2, 3], [2]], dtype=object)
In [313]: d[0].append([2,3])
In [314]: d
Out[314]: array([[[2, 3]], [1, 2, 3], [2]], dtype=object)
我认为你必须硬着头皮使用列表来初始化列表的对象数组。没有捷径:
In [319]: d=np.empty((3,),object)
In [320]: d[...]=[[] for _ in range(3)]
In [321]: d
Out[321]: array([[], [], []], dtype=object)
In [323]: d
Out[323]: array([[], [3], []], dtype=object)