谁能给我解释一下 numpy.indices()?
Can anybody explain me the numpy.indices()?
我已经多次阅读有关 np.indices() 的文档,但我似乎无法理解它的内容。
我已经在很多事情上使用它来了解它的作用,但我仍然无法真正理解它。也许问题是我是编程的初学者,所以我无法理解描述它的文字背后的想法。此外,我不是以英语为母语的人(尽管我对此没有任何问题)。
我将非常感谢更简单的解释,可能是一些例子。谢谢。
假设您有一个矩阵 M,其第 (i,j) 个元素等于
M_ij = 2*i + 3*j
定义此矩阵的一种方法是
i, j = np.indices((2,3))
M = 2*i + 3*j
产生
array([[0, 3, 6],
[2, 5, 8]])
换句话说,np.indices
returns个数组可以用作索引。 i
中的元素表示行索引:
In [12]: i
Out[12]:
array([[0, 0, 0],
[1, 1, 1]])
j
中的元素表示列索引:
In [13]: j
Out[13]:
array([[0, 1, 2],
[0, 1, 2]])
这段代码我明白了。
以下函数与 np.indices() 具有相同的行为。
# fixed dimensions=(2,3,4)
def my_indices():
dimensions = (2,3,4)
A = np.empty(dimensions)
# dimensions[0] = 2
A[0, :, :] = 0
A[1, :, :] = 1
B = np.empty(dimensions)
# dimensions[1] = 3
B[:, 0, :] = 0
B[:, 1, :] = 1
B[:, 2, :] = 2
C = np.empty(dimensions)
# dimensions[2] = 4
C[:, :, 0] = 0
C[:, :, 1] = 1
C[:, :, 2] = 2
C[:, :, 3] = 3
return [A, B, C]
通话
A, B, C = my_indices()
print(A.shape)
print(B.shape)
print(C.shape)
print('A\n', A)
print('B\n', B)
print('C\n', C)
结果
(2, 3, 4)
(2, 3, 4)
(2, 3, 4)
A
[[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
B
[[[0. 0. 0. 0.]
[1. 1. 1. 1.]
[2. 2. 2. 2.]]
[[0. 0. 0. 0.]
[1. 1. 1. 1.]
[2. 2. 2. 2.]]]
C
[[[0. 1. 2. 3.]
[0. 1. 2. 3.]
[0. 1. 2. 3.]]
[[0. 1. 2. 3.]
[0. 1. 2. 3.]
[0. 1. 2. 3.]]]
np.indices() 用例
def create_hsv_map():
img_hsv = np.empty((180, 256, 3), np.uint8)
hue, saturation = np.indices((180,256))
img_hsv[:, :, 0] = hue
img_hsv[:, :, 1] = saturation
img_hsv[:, :, 2] = 255
# ...
示例 np.repeat() 而不是 np.indices()
def create_hsv_map2():
img_hsv = np.empty((180, 256, 3), np.uint8)
hue = np.repeat(np.arange(180).reshape(180, 1), repeats=256, axis=1)
saturation = np.repeat(np.arange(256).reshape(1, 256), repeats=180, axis=0)
img_hsv[:, :, 0] = hue
img_hsv[:, :, 1] = saturation
img_hsv[:, :, 2] = 255
# ...
已经发布的答案仍然很复杂,所以这里有一个最简单的理解方法。
第 1 步: 让我们创建一个 2x2 网格
ids = np.indices((2,2))
第 2 步: 现在让我们解压 i,j
索引
i, j = ids
这些是索引 i,j
:
print(i)
[[0 0]
[1 1]]
print(j)
[[0 1]
[0 1]]
第 3 步: 了解 i,j
代表什么
想到它的简单方法是将其配对为 (i0,j0), (i1,j1), (i2,j2), (i3,j3)
即将 i
的每个元素与 j
.
的对应元素匹配
所以我们得到:(0,0), (0,1), (1,0), (1,1)
.
这些正是 2x2 网格的索引:
我已经多次阅读有关 np.indices() 的文档,但我似乎无法理解它的内容。 我已经在很多事情上使用它来了解它的作用,但我仍然无法真正理解它。也许问题是我是编程的初学者,所以我无法理解描述它的文字背后的想法。此外,我不是以英语为母语的人(尽管我对此没有任何问题)。 我将非常感谢更简单的解释,可能是一些例子。谢谢。
假设您有一个矩阵 M,其第 (i,j) 个元素等于
M_ij = 2*i + 3*j
定义此矩阵的一种方法是
i, j = np.indices((2,3))
M = 2*i + 3*j
产生
array([[0, 3, 6],
[2, 5, 8]])
换句话说,np.indices
returns个数组可以用作索引。 i
中的元素表示行索引:
In [12]: i
Out[12]:
array([[0, 0, 0],
[1, 1, 1]])
j
中的元素表示列索引:
In [13]: j
Out[13]:
array([[0, 1, 2],
[0, 1, 2]])
这段代码我明白了。
以下函数与 np.indices() 具有相同的行为。
# fixed dimensions=(2,3,4)
def my_indices():
dimensions = (2,3,4)
A = np.empty(dimensions)
# dimensions[0] = 2
A[0, :, :] = 0
A[1, :, :] = 1
B = np.empty(dimensions)
# dimensions[1] = 3
B[:, 0, :] = 0
B[:, 1, :] = 1
B[:, 2, :] = 2
C = np.empty(dimensions)
# dimensions[2] = 4
C[:, :, 0] = 0
C[:, :, 1] = 1
C[:, :, 2] = 2
C[:, :, 3] = 3
return [A, B, C]
通话
A, B, C = my_indices()
print(A.shape)
print(B.shape)
print(C.shape)
print('A\n', A)
print('B\n', B)
print('C\n', C)
结果
(2, 3, 4)
(2, 3, 4)
(2, 3, 4)
A
[[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
B
[[[0. 0. 0. 0.]
[1. 1. 1. 1.]
[2. 2. 2. 2.]]
[[0. 0. 0. 0.]
[1. 1. 1. 1.]
[2. 2. 2. 2.]]]
C
[[[0. 1. 2. 3.]
[0. 1. 2. 3.]
[0. 1. 2. 3.]]
[[0. 1. 2. 3.]
[0. 1. 2. 3.]
[0. 1. 2. 3.]]]
np.indices() 用例
def create_hsv_map():
img_hsv = np.empty((180, 256, 3), np.uint8)
hue, saturation = np.indices((180,256))
img_hsv[:, :, 0] = hue
img_hsv[:, :, 1] = saturation
img_hsv[:, :, 2] = 255
# ...
示例 np.repeat() 而不是 np.indices()
def create_hsv_map2():
img_hsv = np.empty((180, 256, 3), np.uint8)
hue = np.repeat(np.arange(180).reshape(180, 1), repeats=256, axis=1)
saturation = np.repeat(np.arange(256).reshape(1, 256), repeats=180, axis=0)
img_hsv[:, :, 0] = hue
img_hsv[:, :, 1] = saturation
img_hsv[:, :, 2] = 255
# ...
已经发布的答案仍然很复杂,所以这里有一个最简单的理解方法。
第 1 步: 让我们创建一个 2x2 网格
ids = np.indices((2,2))
第 2 步: 现在让我们解压 i,j
索引
i, j = ids
这些是索引 i,j
:
print(i)
[[0 0]
[1 1]]
print(j)
[[0 1]
[0 1]]
第 3 步: 了解 i,j
代表什么
想到它的简单方法是将其配对为 (i0,j0), (i1,j1), (i2,j2), (i3,j3)
即将 i
的每个元素与 j
.
所以我们得到:(0,0), (0,1), (1,0), (1,1)
.
这些正是 2x2 网格的索引: