理解非同类numpy数组

时间:2017-05-02 05:23:11

标签: python numpy

我最近开始笨拙,注意到一件奇怪的事情。

import numpy as np
a = np.array([[1,2,3], [4,5,9, 8]])
print a.shape, "shape"
print a[1, 0]

在这种情况下,形状为2L。但是,如果我将同质numpy数组设为 a = np.array([[1,2,3], [4,5,6]],则a.shape会给出(2L, 3L)。我知道非同质数组的形状很难表示为元组。

此外,我之前创建的非同质数组的print a[1,0]给出了回溯IndexError: too many indices for array。在同质数组上执行相同操作会返回正确的元素4

注意到这两个特点,我很想知道python如何看待低级别的非同质numpy数组。 提前谢谢

1 个答案:

答案 0 :(得分:3)

当子列表的长度不同时,np.array会回退到创建object dtype数组:

In [272]: a = np.array([[1,2,3], [4,5,9, 8]])
In [273]: a
Out[273]: array([[1, 2, 3], [4, 5, 9, 8]], dtype=object)

此数组类似于我们开始使用的列表。两者都将子列表存储为指针。子列表存在于内存中的其他位置。

使用相同长度的子对象,它可以创建一个带有整数元素的二维数组:

In [274]: a2 = np.array([[1,2,3], [4,5,9]])
In [275]: a2
Out[275]: 
array([[1, 2, 3],
       [4, 5, 9]])

事实上为了证实我声称子列表存储在内存中的其他位置,让我们尝试更改一个:

In [276]: alist = [[1,2,3], [4,5,9, 8]]
In [277]: a = np.array(alist)
In [278]: a
Out[278]: array([[1, 2, 3], [4, 5, 9, 8]], dtype=object)
In [279]: a[0].append(4)
In [280]: a
Out[280]: array([[1, 2, 3, 4], [4, 5, 9, 8]], dtype=object)
In [281]: alist
Out[281]: [[1, 2, 3, 4], [4, 5, 9, 8]]

a2的情况下,这不起作用。 a2有自己的数据存储,与源列表无关。

基本点是np.array尝试在可能的情况下创建n-d数组。如果它不能它再次创建一个对象dtype数组。而且,正如其他问题所讨论的那样,它有时会引发错误。故意创建一个对象数组也很棘手。

a的形状很简单,(2,)。单个元素元组。 a是一个1d数组。但是这种形状并没有传达有关a元素的信息。 alist的元素也是如此。 len(alist)是2.对象数组可以具有更复杂的形状,例如a.reshape(1,2,1),但它仍然只包含指针

a包含2个4byte指针; a2包含6个4字节整数。

n [282]: a.itemsize
Out[282]: 4
In [283]: a.nbytes
Out[283]: 8
In [284]: a2.nbytes
Out[284]: 24
In [285]: a2.itemsize
Out[285]: 4