2016-07-26 109 views
-1

很长一段时间,我总是使用np.array,np.asarraynp.asanyarray来将array_like列表转换为数组。np.asarray(标量)的输出是什么?

但是,当将标量转换为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维数组,在其__str__中仍然包含123

size=0一个真正的空数组应该是array([])

print np.array([]).nbytes # 0 
print np.array(123).nbytes # 8 
print type(np.array(123)) # numpy.ndarray 

显然,他们是不同的,但它们的大小既是0

+0

'x.shape'表示x **为空形**。 'x'是一个标量,还有什么? – Julien

+0

@JulienBernu,'print x'显示'array(123)',而不是'array([]'),它是普通的空数组。 – Lee

+0

downvoted的人,请至少发表评论。问题不清楚,甚至你认为它太简单和愚蠢。 'x'不是标量,而是'numpy.ndarray'。 – Lee

回答

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)的相似性。我已经在初学者的代码中看到过它,但是自己并不需要它。