如何创建行大小不同的多维numpy数组?

85 投票
8 回答
148974 浏览
提问于 2025-04-16 02:10

我想创建一个二维的numpy数组,这个数组的每一行包含的元素数量不一样。

我尝试了下面的代码

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

但是出现了错误

ValueError: setting an array element with a sequence.

8 个回答

22

在Numpy中,这种情况支持得不是很好(因为一般来说,“二维数组”中的每一行长度都是相同的)。如果你用一个Python列表来存放Numpy数组,这可能是个不错的解决办法,因为这样你可以在需要的时候享受到Numpy的好处:

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

现在距离这个问题被提出来已经快7年了,而你的代码

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

在numpy 1.12.0和python 3.5中运行时,没有出现任何错误,并且cells的内容是:

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

你可以通过cells[0][2] # (=2)来访问cells中的元素。

如果你想在新的元素(也就是数组)可用时动态地构建你的numpy数组列表,可以考虑使用append,这是一种替代方案,参考tom10的解决方案

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])]
47

Numpy虽然可以处理各种对象的数组,但它其实是为了处理固定尺寸的数字数组而优化的。如果你真的需要数组里面再有数组,使用嵌套列表会更好。不过,根据你数据的使用情况,可能还有其他更合适的数据结构,比如如果有一些无效的数据点,可以使用掩码数组。

如果你真的想要灵活的Numpy数组,可以使用下面的方式:

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

不过这样做会创建一个一维数组,里面存的是对列表的引用,这样你就会失去Numpy大部分的好处,比如向量处理、局部性、切片等等。

撰写回答