python - 将 1d numpy ndarray 分配到 2d 数组的列中
问题描述
假设dst
是一个形状为(5,N)ramp
的ndarray,并且是一个形状为(5,)的ndarray。(在这种情况下,N = 2):
>>> dst = np.zeros((5, 2))
>>> dst
array([[0., 0.],
[0., 0.],
[0., 0.],
[0., 0.],
[0., 0.]])
>>> ramp = np.linspace(1.0, 2.0, 5)
>>> ramp
array([1. , 1.25, 1.5 , 1.75, 2. ])
现在我想将 ramp 复制到 dst 的列中,结果如下:
>>> dst
array([[1., 1.],
[1.25., 1.25.],
[1.5., 1.5.],
[1.75, 1.75],
[2.0, 2.0]])
我没想到这会起作用,而且它不会:
>>> dst[:] = ramp
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (5) into shape (5,2)
这行得通,但我确信有一种更“numpyesque”的方式来实现这一点:
>>> dst[:] = ramp.repeat(dst.shape[1]).reshape(dst.shape)
>>> dst
array([[1. , 1. ],
[1.25, 1.25],
[1.5 , 1.5 ],
[1.75, 1.75],
[2. , 2. ]])
有任何想法吗?
笔记
与“克隆”行或列向量不同,我想分配ramp
到dst
(甚至是的子集dst
)。此外,那里给出的解决方案使用 python 数组作为源,而不是 ndarray,因此需要调用 .transpose 等。
解决方案
方法1:使用广播:
正如评论中提到的OP。广播也适用于分配
dst[:] = ramp[:,None]
方法2:使用column_stack
N = dst.shape[1]
dst[:] = np.column_stack([ramp.tolist()]*N)
Out[479]:
array([[1. , 1. ],
[1.25, 1.25],
[1.5 , 1.5 ],
[1.75, 1.75],
[2. , 2. ]])
方法3:使用np.tile
N = dst.shape[1]
dst[:] = np.tile(ramp[:,None], (1,N))
推荐阅读
- c# - CS0023 C# 运算符不能应用于“字符串 []”类型的操作数
- ios - Square Point of Sales API 发送 reference_id 或 userInfoString
- javascript - Wikidata 查询城市使用的语言列表
- android - Kotlin 片段类型不匹配
- google-apps-script - Drive.Files.Copy 和“父母”不起作用
- php - 如何在非主键列上添加自动增量,但它们仍然是我想设置为主键的另一列
- mysql - 创建计数器时创建存储过程出错
- artifactory - Artifactory 启动脚本在 Ubuntu 18.04.1 上无法正常工作
- java - 从 Java 中的(文本)文件中删除标签和内容
- android - 从第三个活动设置主活动列表的数据?