如何创建行大小不同的多维numpy数组?
我想创建一个二维的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大部分的好处,比如向量处理、局部性、切片等等。