【发布时间】:2018-06-02 19:04:15
【问题描述】:
问题:
我有一个 numpy 数组
tf = numpy.full((500, 4, 1, 2), [500, 1])
tf :
array([[[[ 500., 1.]],
[[ 500., 1.]],
[[ 500., 1.]],
[[ 500., 1.]]],
...,
[[[ 500., 1.]],
[[ 500., 1.]],
[[ 500., 1.]],
[[ 500., 1.]]]])
tf.shape :
(500, 4, 1, 2)
考虑第一组:
tf[0][0]这是:array([[ 500., 1.]])
我需要能够附加(就地)附加值,例如 [[100, 0.33], [1, 0.34], [15, 0.33]],以便最终结果看起来像(对每个元素执行此操作):
tf :
array([[[[ 500., 1.], [100., 0.33], [1., 0.34], [15., 0.33]],
[[ 500., 1.]],
[[ 500., 1.]],
[[ 500., 1.]]],
...,
[[[ 500., 1.]],
[[ 500., 1.]],
[[ 500., 1.]],
[[ 500., 1.]]]])
我试过numpy.concatenate((tf[0][0], [[100, 0.33]]), axis = 0) 这会返回一个新的附加ndarray,但我无法将它分配回tf[0][0],因为它失败并出现以下错误。
ValueError: could not broadcast input array from shape (2,2) into shape (1,2)
还有其他方法可以使用 numpy 实现我想要的吗?
================================================ ===========
效率低下的list 做法:
# initialization
tf = [[[]] for i in xrange(500)]
for i in xrange(500):
tf[i] = [[] for a in xrange(4)]
for j in xrange(4):
tf[i][j].append([500, 1.0])
# usage: (for any 0 < i < 500; 0 < j < 4 )
tf[i][j].append([100, 0.33])
但这是低效的(考虑到我需要这样做超过一百万次)
【问题讨论】:
-
你不能使用
numpy.ndarrays来做到这一点,这是真正的、固定大小的多维数组。执行此操作的有效方法是使用列表。 -
@juanpa.arrivillaga
this operation is carried out for each of the elements- 所以看起来它不会是一个参差不齐的数组,而是一个普通的数组。 -
一个后续问题,然后是,如何有效地将这个嵌套列表转换为 ndarray 以进行进一步处理?
-
@Divakar 也许,OP 可以详细说明。
-
@okkhoy 转换为
ndarray你唯一的选择是使用某种dtype=object数组,这基本上是一个坏列表。您在什么意义上的“低效”是指“低效的列表方式”?
标签: python arrays numpy append