设一个 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/