python - 使用 1d 列索引数组切片和填充 2d 数组
问题描述
首先,这是我正在尝试做的一维模拟..
假设我有一个 0 的一维数组,我想用 1 替换索引 2 开始的每个 0。我可以这样做:
import numpy as np
x = np.array([0,0,0,0])
i = 2
x[i:] = 1
print(x) # [0 0 1 1]
现在,我试图找出这个操作的 2d 版本。首先,我有一个 5x4 的 0 数组,例如
foo = np.zeros(shape = (5,4))
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
以及相应的 5 元素列索引数组,例如
fill_locs = np.array([0, 3, 1, 1, 2])
对于 foo 的每一行,我想i:
用 1 填充列,其中.i
给出的索引是fill_locs
. foo[fill_locs.reshape(-1, 1):] = 1
感觉不错,但不起作用。
我想要的输出应该看起来像
expected_result = np.array([
[1, 1, 1, 1],
[0, 0, 0, 1],
[0, 1, 1, 1],
[0, 1, 1, 1],
[0, 0, 1, 1],
])
解决方案
您不需要切片,也不需要创建原始数组。您可以通过广播比较来完成所有这些工作。
a = np.array([0, 3, 1, 1, 2])
n = 4
(a[:, None] <= np.arange(n)).view('i1')
array([[1, 1, 1, 1],
[0, 0, 0, 1],
[0, 1, 1, 1],
[0, 1, 1, 1],
[0, 0, 1, 1]], dtype=int8)
或使用less_equal.outer
np.less_equal.outer(a, np.arange(n)).view('i1')
推荐阅读
- python - 由于未找到模块“pd.core.dtypes.common”,本地 Ubuntu 机器拒绝导入 Pandas
- java - 来自 textView 的 getIdentifier() 返回 null
- java - 试图理解 Java 中的命名空间是什么
- java - 如何在 Hive 2 中将数据插入到复杂数据类型“Struct”中
- wcf - WCF:无法为具有权限“dev.xxxxx.com”的 SSL/TLS 安全通道建立信任关系
- java - 测量异步方法的执行时间
- reactjs - React 的合成事件与 addEventListener 相比有什么优势吗?
- angular-cli - 无法在 Angular6 中的 `.angular-cli.json` 错误中找到任何应用程序
- php - 从 PHP 中的输入类型文件中获取所选文件的原始路径
- java - 我需要在java中放置两个线程并让我的代码的一部分等待另一部分结束