如何转换元素然后插入到numpy数组中

时间:2015-02-09 17:47:11

标签: python arrays numpy

我是python和numpy的新手。我有一个像这样的numpy数组:

a = [[  0.      2.      0.     0.      0.      0.   ]
     [  0.     14.      0.     0.      0.      0.   ]]

对于第一个数组,其中2是,我想插入1 0 0,对于第二个数组14,我想插入0 0 1,以便最终结果如下所示: / p>

a = [[  0.      1.      0.      0.      0.     0.      0.      0.   ]
     [  0.      0.      0.      1.      0.     0.      0.      0.   ]]

最简单的方法是什么?

1 个答案:

答案 0 :(得分:1)

所需数组的形状与原始数组a不同。 因此,您无法使用简单切片生成所需的数组 分配,或单个调用分配函数,如numpy.placenumpy.putnumpy.putmasknumpy.copyto

因此,我认为不是将此视为分配和插入操作 将它视为新阵列的构造可能更好。 有很多方法可以做到这一点:

  • 您可以使用numpy.concatenate

    np.concatenate([a[:,:1], b, a[:,2:]], axis=1)
    
  • numpy.column_stack

    np.column_stack([a[:,:1], b, a[:,2:]])
    
  • numpy.c_

    np.c_[a[:,:1], b, a[:,2:]]
    
  • numpy.bmat

    np.array(np.bmat([a[:,:1], b, a[:,2:]]))
    
  • 或为空数组分配空间,并将值分配给c

    的切片
    c = np.empty((a.shape[0], a.shape[1]+b.shape[1]-1), dtype=a.dtype)
    c[:, :1] = a[:, :1]
    c[:, 1:4] = b
    c[:, 4:] = a[:, 2:]
    

    这里没有必要,但要记住,分配和分配是构建数组的可行方法。有时,虽然不在这里,但它甚至是您最快的选择。

  • numpy.deletenumpy.insert

    np.insert(np.delete(a, [1], 1), [1], b, axis=1)
    

    但我建议您不要使用insertdeletenp.delete创建了一个新数组 从a复制的值。相反,切片a[:,:1]a[:,2:]是<{1}}的观看次数,因此不需要任何复制。额外的 分配和复制使此方法比显示的其他方法慢 上方。


例如,如果我们定义:

a

然后

import numpy as np
a = np.array([[  0.,   2.,   0.,   0.,   0.,   0.],
              [  0.,  14.,   0.,   0.,   0.,   0.]])
b = np.array([(1, 0, 0), 
              (0, 0, 1)])

(其他选项产生相同的结果。)