np.asarray(标量)的输出是什么?

时间:2016-07-26 12:41:37

标签: python arrays numpy type-conversion

很长一段时间以来,我总是使用np.arraynp.asarraynp.asanyarray将array_like列表转换为数组。

但是当将标量转换为numpy数组时,我知道np.atleast_1d(123)会产生正确的结果array([123])

但我对np.arraynp.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

1 个答案:

答案 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)的相似之处。我在初学者的代码中看过它,但我自己并不需要它。