很长一段时间以来,我总是使用np.array
,np.asarray
和np.asanyarray
将array_like列表转换为数组。
但是当将标量转换为numpy数组时,我知道np.atleast_1d(123)
会产生正确的结果array([123])
。
但我对np.array
和np.asarray
i = 123
x = np.array(i, dtype=np.int)
print x # array(123)
print x.shape # ()
print x.size # 0
由于x.shape
表示x
为空,所以array(123)
是什么?这是一个0维数组,其123
中仍包含__str__
。
一个真正的size=0
空数组应为array([])
,
print np.array([]).nbytes # 0
print np.array(123).nbytes # 8
print type(np.array(123)) # numpy.ndarray
显然它们是不同的,尽管它们的大小都是0
。
答案 0 :(得分:2)
我将此0d
案例视为nd
的自然延续。 MATLAB使2d成为下限。 numpy
可以使用1d
,而是选择0d
。
数组包含数据缓冲区,是否存储值字节,dtype(如何解释这些字节)和shape
(加strides
)。 shape
是(显示为)元组。 Python允许元组具有0,1,2或更多元素,那么为什么不应该具有相同的灵活性?
查看atleast_1d
做什么
res = []
for ary in arys:
ary = asanyarray(ary)
if len(ary.shape) == 0:
result = ary.reshape(1)
else:
result = ary
res.append(result)
if len(res) == 1:
return res[0]
else:
return res
它可以使用输入列表(标量,数组,列表等)
In [374]: np.atleast_1d(np.array(1),np.array([1]),np.array([[1]]))
Out[374]: [array([1]), array([1]), array([[1]])]
它将每个转换为数组(根据需要),然后检查暗淡(形状的len)。如果是0d,则将其重新整形为(1,)。此重塑不会更改数据缓冲区。 atleast_2d
result = ary.reshape(1, 1)
。
你也可以ndmin
:
In [382]: np.array(1,ndmin=1)
Out[382]: array([1])
np.array(1)
在很多方面都与np.int32(1)
相似。两者都有()
形状,两者都有像sum()
这样的方法。唯一明显的区别在于它们的打印格式。
我不知道有意构造0d数组的任何理由。如果我真的想要一个1d数组,那么写np.array([1])
同样容易。但你应该知道如果它出现如何处理一个。这包括使用.item()
提取标量值,并使用[()]
建立索引。
我在使用scipy.io.loadmat
加载MATLAB文件的SO问题中经常遇到这个问题。一些MATLAB
构造作为0d对象数组返回。
另一种思考0d数组的方法是将整个数组方法添加(或保留)到标量中 - 而不必明确指定dtype
。
我提到了与np.int32(1)
的相似之处。我在初学者的代码中看过它,但我自己并不需要它。