2015-02-09 65 views
0

我是python和numpy的新手。我有数组的numpy的阵列,像这样:如何转换元素,然后插入到numpy数组

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

对于第一阵列,其中,2是,我要插入1 0 0,而对于第二阵列,其中图14是,我要插入0 0 1,以便最终结果如下所示:

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

要做到这一点,最简单的方法是什么?

+0

我会用切片和'place()',参见http://docs.scipy.org/doc/numpy/reference/generated/numpy.pl ace.html – madtowneast 2015-02-09 17:52:08

+0

对于'2',您正在替换一个值。对于'14',你正在替换一个值(用0)并插入一个(2,2)数组。两种不同的行为。 – hpaulj 2015-02-09 20:35:44

回答

1

所需阵列与原始阵列a的形状不同。 因此,您不能通过使用简单片 分配或单个调用分配函数(如numpy.place,numpy.put,numpy.putmask, 或numpy.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) 
    

    我不推荐使用insertdelete但是。 np.delete创建一个 值从a复制的新阵列。相反,切片a[:,:1]a[:,2:]的意见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)]) 

然后

In [69]: np.concatenate([a[:,:1],b,a[:,2:]], axis=1) 
Out[69]: 
array([[ 0., 1., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0., 0.]]) 

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

相关问题