我有一个数组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而不是。
答案 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])
说明 -
np.arange(x.size)%2)
为我们提供0s
和1s
。x + np.array([-1,0,1])[:,None])
广播以矢量化方式获取摘要。1s
中创建的交替0s
和step-1
在步骤2中设置或不设置求和数组的列,从而生成最终输出。示例运行 -
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 |