当你让Numpy从一个包含任意对象的集合中创建一个数组时,它会创建一个“object”类型的数组,这允许你在这些对象之间使用索引切片,但是由于对象本身对Numpy来说是未知的,你不能一次索引到对象中(即使那个特定的对象**实际上是一个Numpy数组)。
但是,如果你对object数组进行切片,选择实际上是numpy数组的object数组部分,numpy似乎不会将切片折叠成一个numpy数组,即使再次调用np.array()
也是如此。
>>> aa = np.array([np.random.randn(3, 4), {'something': 'blah'}], dtype=object)
>>> aa.shape
(2,)
>>> np.array(aa[0:1])
array([array([[ 1.78237043, -0.61082005, 0.92160137, 0.58961677],
[ 1.54183639, -0.43097464, 1.36213935, -1.2695875 ],
[ 0.01431181, -0.62073519, 0.56267489, -0.46113538]])],
dtype=object)
>>> np.array(aa[0:1]).shape # I want this to be (1, 3, 4)
(1,)
是否有任何方法可以做到这一点,而不需要双重拷贝(例如,不像这样:np.array(aa[0:1].tolist())
)?对象数组是否允许您在没有副本的情况下执行此操作?
1条答案
按热度按时间nhn9ugyo1#
您可以使用
np.stack
将对象类型数组组合为普通的ndarray
:这也适用于对象数组中的多个ndarray,只要它们具有兼容的大小。
在内部,它只是把对象数组当作一个序列并在其上迭代,我不确定它是否比
np.array(aa[0:1].tolist())
的解决方案有显著的性能优势。