有效地将未对齐的元素插入numpy数组

通用汽车

我正在使用numpy 1.9来处理一组数组。假设我有类似的东西我有两个2D阵列AB和一个1-d阵列C,其看起来像这样:

>>> A
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])
>>> B
array([[-1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1.]])
>>> C
array([1, 3, 2, 4, 0])

我的目标是根据C的要求,在A中插入B的所有元素。更具体地说,如果位置0的C具有1,则B [0,1]应该插入A [0,1]之后。

这是预期的结果:

array([[ 1,  1, -1,  1,  1,  1],
       [ 1,  1,  1,  1, -1,  1],
       [ 1,  1,  1, -1,  1,  1],
       [ 1,  1,  1,  1,  1, -1],
       [ 1, -1,  1,  1,  1,  1]])

我试图像这样实现它,但是速度不是很快:

for i in xrange(size(C, 0)):
    j = C[i]
    A[i, :] = numpy.insert(A[i], j, B[i, j])

有没有办法使它更快?(使用单个numpy操作(例如遮罩或类似方法)进行操作)

沃伦·韦克瑟(Warren Weckesser)

讨厌的单线怎么样?

一,数据;数组的形状与您的数组相同,但是我使用整数使示例更易于阅读。

In [81]: A
Out[81]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

In [82]: B
Out[82]: 
array([[   0,  100,  200,  300,  400],
       [ 500,  600,  700,  800,  900],
       [1000, 1100, 1200, 1300, 1400],
       [1500, 1600, 1700, 1800, 1900],
       [2000, 2100, 2200, 2300, 2400]])

In [83]: C
Out[83]: array([1, 3, 2, 4, 0])

这是讨厌的一线客:

In [84]: np.insert(A.ravel(), np.ravel_multi_index((range(A.shape[0]), C), A.shape) + 1, B[range(B.shape[0]), C]).reshape(A.shape[0], A.shape[1]+1)
Out[84]: 
array([[   0,    1,  100,    2,    3,    4],
       [   5,    6,    7,    8,  800,    9],
       [  10,   11,   12, 1200,   13,   14],
       [  15,   16,   17,   18,   19, 1900],
       [  20, 2000,   21,   22,   23,   24]])

这是细分版本:

A.ravel()展平A为一维数组,我将其称为F

In [87]: F = A.ravel()

In [88]: F
Out[88]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24])

(编辑:事实证明,第一步-展平-A不必要。正如@hpaulj在他的答案中指出的那样,np.insert默认情况下将展平该数组。)

np.ravel_multi_index用于将所需的2-d位置转换为索引到展平数组中。+ 1,因为你要插入的元素在年底是必要的给出的指标C

In [89]: insert_indices = np.ravel_multi_index((range(A.shape[0]), C), A.shape) + 1

In [90]: insert_indices
Out[90]: array([ 2,  9, 13, 20, 21])

B[range(B.shape[0]), C]从中拉出所需的值B

In [91]: values = B[range(B.shape[0]), C]

In [92]: values
Out[92]: array([ 100,  800, 1200, 1900, 2000])

np.insert 进行实际插入并创建一个新数组:

In [93]: np.insert(F, insert_indices, values)
Out[93]: 
array([   0,    1,  100,    2,    3,    4,    5,    6,    7,    8,  800,
          9,   10,   11,   12, 1200,   13,   14,   15,   16,   17,   18,
         19, 1900,   20, 2000,   21,   22,   23,   24])

现在,只需重塑它即可获得最终结果:

In [94]: np.insert(F, insert_indices, values).reshape(A.shape[0], A.shape[1]+1)
Out[94]: 
array([[   0,    1,  100,    2,    3,    4],
       [   5,    6,    7,    8,  800,    9],
       [  10,   11,   12, 1200,   13,   14],
       [  15,   16,   17,   18,   19, 1900],
       [  20, 2000,   21,   22,   23,   24]])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 Postgres 中的特定索引处有效地将元素插入 json 数组

有效地将数组按元素分组

如何有效地将numpy数组中的对应元素相乘?

如何有效地将2维数组中的每个元素乘以Numpy中的1维数组?

如何有效地将X模Y添加到numpy数组中的每个元素?

如何有效地在地图中插入元素?

如何有效地在数组的任意位置插入元素?

有效地插入数字-NumPy / Python

有效地将numpy数组转换为pandas系列数组

有效地计数numpy数组中的零个元素?

根据字典有效地替换数组中的元素-NumPy / Python

如何有效地操作大型numpy数组

有效地对numpy数组进行降序排序?

有效地修改 numpy 数组

numpy:有效地与索引数组求和

Numpy 数组:有效地赋值

有效地计算NumPy数组的成对相等

如何有效地组合许多numpy数组?

如果尚不存在,如何有效地将元素添加/推入数组

有效地将多维数组中元素的引用编码为字符串

如何有效地将Matlab引擎数组转换为numpy ndarray?

有效地将pandas系列的float与pandas系列的numpy数组进行比较

numpy 的替代方法,用于有效地将条件应用于数组

如何有效地将条件应用于numpy数组的索引?

有效地将gmpy2.mpz转换为numpy布尔数组

有效地将System.Single [,]转换为numpy数组

将函数有效地应用于numpy数组中的球面邻域

如何有效地将随机垂直段添加到 numpy 数组中?

有效地将 int 数组写入文件