2010-08-02 113 views

回答

17

虽然numpy的知道任意对象的阵列,它为具有固定尺寸的数字均匀阵列优化。如果你真的需要数组的数组,最好使用嵌套列表。但根据数据的预期用途,不同的数据结构可能会更好,例如,如果您有一些无效的数据点,则会显示一个蒙版数组。

如果你真的想灵活numpy的阵列,使用这样的:

numpy.array([[0,1,2,3], [2,3,4]], dtype=object) 

然而,这将创建一个一维数组存储到列表的引用,这意味着你将失去大部分的好处Numpy(矢量处理,位置,切片等)。

12

这在Numpy中没有得到很好的支持(根据定义,几乎在任何地方,“二维数组”都具有相同长度的所有行)。 numpy的阵列的Python列表可能是你一个很好的解决方案,因为这样你会得到你可以用它们numpy的优势:

cells = [numpy.array(a) for a in [[0,1,2,3], [2,3,4]]] 
12

我们现在的问题被问了近7年后,和你的代码

cells = numpy.array([[0,1,2,3], [2,3,4]]) 

在numpy的1.12.0,蟒蛇3.5执行,不会产生任何错误和 cells包含:

array([[0, 1, 2, 3], [2, 3, 4]], dtype=object) 

您访问cells元素为cells[0][2] # (=2)

,如果你想建立的飞行作为新的元素(即数组)您numpy的数组列表tom10的解决方案的另一种可用方法是使用append

d = []     # initialize an empty list 
a = np.arange(3)  # array([0, 1, 2]) 
d.append(a)   # [array([0, 1, 2])] 
b = np.arange(3,-1,-1) #array([3, 2, 1, 0]) 
d.append(b)   #[array([0, 1, 2]), array([3, 2, 1, 0])] 
+0

问题是,你仍然不能使用d.mean(),d.flatten()等 – episodeyang 2017-12-05 06:04:28

1

另一种选择是将存储您的数组作为一个连续的数组并存储它们的大小或偏移量。这需要更多关于如何操作数组的概念性思考,但是可以使大量的操作工作,就好像您有一个具有不同大小的二维数组。在他们不能的情况下,可以使用np.split来创建calocedrus建议的列表。最简单的操作是ufuncs,因为它们几乎不需要修改。这里有一些例子:

cells_flat = numpy.array([0, 1, 2, 3, 2, 3, 4]) 
# One of these is required, it's pretty easy to convert between them, 
# but having both makes the examples easy 
cell_lengths = numpy.array([4, 3]) 
cell_starts = numpy.insert(cell_lengths[:-1].cumsum(), 0, 0) 
cell_lengths2 = numpy.diff(numpy.append(cell_starts, cells_flat.size)) 
assert np.all(cell_lengths == cell_lengths2) 

# Copy prevents shared memory 
cells = numpy.split(cells_flat.copy(), cell_starts[1:]) 
# [array([0, 1, 2, 3]), array([2, 3, 4])] 

numpy.array([x.sum() for x in cells]) 
# array([6, 9]) 
numpy.add.reduceat(cells_flat, cell_starts) 
# array([6, 9]) 

[a + v for a, v in zip(cells, [1, 3])] 
# [array([1, 2, 3, 4]), array([5, 6, 7])] 
cells_flat + numpy.repeat([1, 3], cell_lengths) 
# array([1, 2, 3, 4, 5, 6, 7]) 

[a.astype(float)/a.sum() for a in cells] 
# [array([ 0.  , 0.16666667, 0.33333333, 0.5  ]), 
# array([ 0.22222222, 0.33333333, 0.44444444])] 
cells_flat.astype(float)/np.add.reduceat(cells_flat, cell_starts).repeat(cell_lengths) 
# array([ 0.  , 0.16666667, 0.33333333, 0.5  , 0.22222222, 
#   0.33333333, 0.44444444]) 

def complex_modify(array): 
    """Some complicated function that modifies array 

    pretend this is more complex than it is""" 
    array *= 3 

for arr in cells: 
    complex_modify(arr) 
cells 
# [array([0, 3, 6, 9]), array([ 6, 9, 12])] 
for arr in numpy.split(cells_flat, cell_starts[1:]): 
    complex_modify(arr) 
cells_flat 
# array([ 0, 3, 6, 9, 6, 9, 12]) 
相关问题