python - 在 numpy 中通过变量 [m] 数组切片 [m, n] 数组

标签 python numpy slice

设一个 numpy 数组,形状为 [M],数据类型为 int32,(随机)值在 [0, N) 范围内,例如:

M = 8
N = 5
a = np.random.randint(0, N, [M])  # a = [1, 1, 2, 4, 0, 1, 1, 3]

从这个数组中,我需要创建一个形状为 [M, N]、数据类型为 int32 且值为 0 或 1 的矩阵 m,其中,如果 j < a[i],则 m[i,j] = 0,否则为 1。示例:

m = some_magic(a)     # m = [[0, 1, 1, 1, 1],
                      #      [0, 1, 1, 1, 1],
                      #      [0, 0, 1, 1, 1],
                      #      [0, 0, 0, 0, 1],
                      #      [1, 1, 1, 1, 1],
                      #      [0, 1, 1, 1, 1],
                      #      [0, 1, 1, 1, 1],
                      #      [0, 0, 0, 1, 1]]

我的功能失调版本的 some_magic 首先将矩阵初始化为零(使用 np.zeros),然后继续将适当的成员设置为 1。

m = np.zeros([M, N])

虽然我无法正确理解下一部分。访问单个成员(例如,每隔一个成员或固定切片)很容易,并且可以通过以下方式实现:

m[np.arange(M), C1:C2]

其中 C1 和 C2 是整数常量,

m[np.arange(M), a:]

据我所知,应该会产生正确的结果,但失败并出现错误

Only integer scalar arrays can be converted to a scalar index.

你能指出我正确的方向吗?非常感谢。

最佳答案

这是使用广播的解决方案。

<小时/>
(a[:, None] <= np.arange(N)).view('i1')
# np.less_equal.outer(a, np.arange(N)).view('i1')

array([[0, 1, 1, 1, 1],
       [0, 1, 1, 1, 1],
       [0, 0, 1, 1, 1],
       [0, 0, 0, 0, 1],
       [1, 1, 1, 1, 1],
       [0, 1, 1, 1, 1],
       [0, 1, 1, 1, 1],
       [0, 0, 0, 1, 1]], dtype=int8)

关于python - 在 numpy 中通过变量 [m] 数组切片 [m, n] 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57915040/

相关文章:

python:将中间人注入(inject)方法调用

python - 按组 sklearn cross_val_score 分为训练和测试

python - 神秘的 scipy "could not convert integer scalar"错误

python - 从 Numpy 数组中删除列的有效方法?

loops - slice 范围的循环索引

python - 通过Python解析文件

python - 使用 patchify 库创建补丁时出现的问题

python - 如何在具有不规则数组形状的 numpy 中对操作进行矢量化/张量化

python - 二维数组的numpy 3d张量

python - 有条件的 Pandas 行向变换