将0插入2d数组

时间:2016-01-08 19:57:28

标签: python arrays numpy

我有一个数组x

x = [0, -1, 0, 3]

我希望y

y = [[0, -2, 0, 2],
     [0, -1, 0, 3],
     [0,  0, 0, 4]]

第一行为x-1,第二行为x,第三行为x+1。所有偶数列索引都为零。

我正在做:

y=np.vstack(x-1, x, x+1)
y[0][::2] = 0
y[1][::2] = 0
y[2][::2] = 0

我原本以为可能会有一个单行代替4而不是。

7 个答案:

答案 0 :(得分:10)

分两行

>>> x = np.array([0, -1, 0, 3])
>>> y = np.vstack((x-1, x, x+1))
>>> y[:,::2] = 0
>>> y
array([[ 0, -2,  0,  2],
       [ 0, -1,  0,  3],
       [ 0,  0,  0,  4]])

说明

y[:, ::2]

给出完整的第一维度。即所有行和每个其他条目形成第二个维度,即列:

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

这与以下不同:

y[:][::2]

因为这分两步完成。第一步:

y[:]

给出了整个数组的视图:

array([[-1, -2, -1,  2],
       [ 0, -1,  0,  3],
       [ 1,  0,  1,  4]])

因此,第二步基本上是这样做的:

y[::2]
array([[-1, -2, -1,  2],
       [ 1,  0,  1,  4]])

它沿着第一个维度工作。即行。

答案 1 :(得分:4)

或者,使用broadcasting

import numpy as np

x = np.array([0, -1, 0, 3])
delta = np.array([-1, 0, 1])
y = x + delta[:, None]
y[:, ::2] = 0

print(repr(y))
# array([[ 0, -2,  0,  2],
#        [ 0, -1,  0,  3],
#        [ 0,  0,  0,  4]])
  • delta指定每行添加/减少的数量
  • 使用None建立索引会插入尺寸为1的新维度
  • delta[:, None].shape == (3, 1)x.shape == (4,),因此x + delta[:, None]的结果会广播到(3, 4)数组
  • 最后,y[:, ::2] = 0用零填充每隔一列。

答案 2 :(得分:3)

NumPy's broadcasting用于单行 -

(np.arange(x.size)%2)*(x + np.array([-1,0,1])[:,None])

说明 -

  1. np.arange(x.size)%2)为我们提供0s1s
  2. 使用x + np.array([-1,0,1])[:,None])广播以矢量化方式获取摘要。
  3. 使用1s中创建的交替0sstep-1在步骤2中设置或不设置求和数组的列,从而生成最终输出。
  4. 示例运行 -

    In [40]: x
    Out[40]: array([ 0, -1,  0,  3])
    
    In [41]: (np.arange(x.size)%2)*(x + np.array([-1,0,1])[:,None])
    Out[41]: 
    array([[ 0, -2,  0,  2],
           [ 0, -1,  0,  3],
           [ 0,  0,  0,  4]])
    

答案 3 :(得分:2)

没有numpy的单行:

x = [0, -1, 0, 3]
y = [ [(x[i] - j if i%2 else 0) for i in range(4)] for j in (1,0,-1)]

提供以下y

[[0, -2, 0, 2], [0, -1, 0, 3], [0,  0, 0, 4]]

答案 4 :(得分:1)

就个人而言,我会以不同的方式看待这一点。您未1添加x,而是添加了[0, 1, 0, 1]

x = np.array([0, -1, 0, 3])
d = np.resize([0, 1], len(x))
y = np.vstack((x-d, x, x+d))

答案 5 :(得分:1)

NumPy中的单行:

>>> x = np.array([0, -1, 0, 3])
>>> y = np.vstack((x-1, x, x+1)) * np.resize([0, 1], len(x))
>>> y
array([[ 0, -2,  0,  2],
       [ 0, -1,  0,  3],
       [ 0,  0,  0,  4]])

答案 6 :(得分:0)

简短版本:[[-1],[0],[1]]*(x!=0)+x

[[-1],[0],[1]]*(x!=0)

     |-1                                    |-1                   | 0 -1 0 -1 |
dot( |0  , [True False True False] ) = dot( |0  ,  [ 1 0 1 0] ) = | 0  0 0  0 |  = z
     |1                                     |1                    | 0  1 0  1 |

z + x是:( braodcasting)

| 0 -1 0 -1 |   | 0 -1 0 3 |    | 0 -2 0 2 |
| 0  0 0  0 | + | 0 -1 0 3 |  = | 0 -1 0 3 |
| 0  1 0  1 |   | 0 -1 0 3 |    | 0  0 0 4 |