gpt4 book ai didi

python - 如何根据所有矩阵形状的给定序列选择数组中的值对?

转载 作者:行者123 更新时间:2023-12-03 20:40:44 25 4
gpt4 key购买 nike

我们尝试根据对角线选择值的过程从矩阵中选择值成对。我的代码无法正常工作
您可以在下面的示例中看到此序列。可以看出,这些值是以交叉形式顺序选择的,从第一个值的倒数第二行开始,从最后一行的第二个值开始连接。然后它向上移动一行并以相同的方式继续。
.在第一个例子中,原理是在第一个例子中取交叉值21-> 32,然后对所有矩阵开始11-> 22、11-> 33,22-> 33,12-> 23等等.第二个例子也一样
代码:

import numpy as np

a=np.array([[11,12,13],
[21,22,23],
[31,32,33]])


w,h = a.shape
for y0 in range(1,h):
y = h-y0-1
for x in range(h-y-1):
print( a[y+x,x], a[y+x+1,x+1] )

for x in range(1,w-1):
for y in range(w-x-1):
print( a[y,x+y], a[y+1,x+y+1] )
我的输出:
21 32
11 22
22 33
12 23
所需的输出
21 32
11 22
11 33
22 33
12 23
但是,如果我使用这个矩阵,例如,它会给我一个错误。
a=np.array([[11,12,13,14,15,16],
[21,22,23,24,25,26],
[31,32,33,34,35,36]])
所需的输出
21 32
11 22
11 33
22 33
12 23
12 34
23 34
13 24
13 35
24 35
14 25
14 36
25 36
15 26
我的输出
错误
  File "C:\Users\Pifkoooo\dp\skuska.py", line 24, in <module>
print( a[y+x,x], a[y+x+1,x+1] )

IndexError: index 2 is out of bounds for axis 0 with size 2
谁能建议我如何解决这个问题并将其推广到所有不同形状的矩阵上?或者是否有另一种方法来完成这项任务?

最佳答案

让我们寻找模式(比如 here ,但更简单)!首先,假设您有一个形状为 (M, N) 的数组, 与 M=4N=5 .首先,让我们注意元素的线性索引:

i = 
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
一旦确定了一对中的第一个元素,下一个元素的线性索引就是 i + N + 1 .
现在让我们尝试使用链接问题中的示例建立第一个元素的路径。首先,查看列索引和行索引:
x = 
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
y =
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
现在取差值,并添加一个因子来说明形状:
x - y + 2M - N =
3 4 5 6 7
2 3 4 5 6
1 2 3 4 5
0 1 2 3 4
第一个元素跟随对角线的索引,除了底行和最右边的列。如果您可以稳定地对该数组进行 argsort( np.argsort 有一个使用 timsort 的 stable 方法),然后将该索引应用于线性索引,则您将获得任何矩阵的每对元素的第一个元素所采用的路径。第一个观察结果将产生第二个元素。
所以这一切都归结为:
M, N = a.shape
path = (np.arange(N - 1) - np.arange(M - 1)[:, None] + 2 * M - N).argsort(None)
indices = np.arange(M * N).reshape(M, N)[:-1, :-1].ravel()[path]
现在你有几个不同的选择:
  • 应用线性 indices致散乱的 a :
    result = a.ravel()[indices[:, None] + [0, N + 1]]
  • 保持形状a并使用 np.unravel_index 转换 indicesindices + N + 1进入二维索引:
    result = a[np.unravel_index(indices[:, None] + [0, N + 1], a.shape)]

  • 故事寓意:这全是黑魔法!

    关于python - 如何根据所有矩阵形状的给定序列选择数组中的值对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67236471/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com