我希望能够转换数组,例如
a = np.array([[1,2], [3,4]])
进入相同的数组但是每个元素作为1元素数组而不是数字。 所需的输出是:
np.array([[np.array([1]), np.array([2])], [np.array([3]), np.array([4])]])
答案 0 :(得分:0)
np.array([ [ [x] for x in row ] for row in [[1,2], [3,4]] ])
答案 1 :(得分:0)
您描述的操作很少有用。更有可能的是,最好在数组的末尾添加一个长度为1的额外维度:
a = a[..., np.newaxis]
# or
a = a.reshape(a.shape + (1,))
然后a[0, 1]
将成为一维数组,但广播和ufuncs等所有不错的NumPy功能都能正常工作。请注意,这会创建原始数组的视图;如果您需要独立副本,可以调用copy()
方法。
如果你真的想要一个二维数组,其元素是一维数组,那么NumPy并不能让你轻松搞定。 (它几乎从来都不是组织数据的好方法,因此NumPy开发人员提供一种简单的方法来做这件事没有多大理由。)你可能希望创建这样的大多数事情。数组将改为创建一个3D数组。我知道的最直接的方法是创建一个空的对象dtype数组,并使用普通的Python循环逐个填充单元格:
b = numpy.empty(a.shape, dtype=object)
for i in range(a.shape[0]):
for j in range(a.shape[1]):
b[i, j] = numpy.array([a[i, j]])
答案 2 :(得分:0)
你正在努力np.array
尝试创建高维数组。
例如,您输入的所需表达式会生成一个(2,2,1)数组:
a2 = np.array([[np.array([1]), np.array([2])], [np.array([3]), np.array([4])]])
In [172]: a2
Out[172]:
array([[[1],
[2]],
[[3],
[4]]])
这可能实际上是你想要的(尽管有印刷品外观),因为
In [180]: a2[0,0]
Out[180]: array([1])
通常最好的方法来对抗numpy
制作更高级数组的趋势,就是使用右shape
和dtype
将其初始化为空,然后填充它:
In [183]: a1=np.empty(a.shape,dtype=object)
In [184]: a1.flat=[np.array(x) for x in a.flatten()]
In [185]: a1
Out[185]:
array([[array(1), array(2)],
[array(3), array(4)]], dtype=object)
它具有正确的形状(2,2)和dtype。元素是数组 - 但它们的尺寸是错误的',()
而不是(1,)
。 flat
和flatten
是用于迭代nd数组的便捷工具,就好像它们是1d一样。
a1.flat=[np.array([x]) for x in a.flatten()]
不起作用 - 它是ints
的数组,如a
,但对象为dtype。
更明确的迭代确实有效:
In [214]: a1=np.empty(a.shape,dtype=object)
In [215]: for i in np.ndindex(2,2):
a1[i]=np.array([a[i]])
In [216]: a1
Out[216]:
array([[array([1]), array([2])],
[array([3]), array([4])]], dtype=object)