python 有没有一个numpy函数可以求数组中两个向量之间的范围

y3bcpkx1  于 2023-03-16  发布在  Python
关注(0)|答案(2)|浏览(116)

numpy中有没有函数,返回两个向量之间的部分:
例:假设此表显示数组
| | | |
| - ------|- ------|- ------|
| 1个|第二章|三个|
| 四个|五个|六个|
| 七|八个|九|
像array[(0,1):(2,3)]将返回
| | |
| - ------|- ------|
| 第二章|三个|
| 五个|六个|
其中两个端点是在范围中指定的向量。(0,1)是最上端,(2,3)是右下端。向量的大小和矩阵的形状都是未知的。

yhqotfr8

yhqotfr81#

(0, 1)中,0指行,1指列。
(2, 3)中,2指行,3指列。
你不能直接使用(0, 1)(2, 3),但是认识到上面的内容,你可以把它们转换成切片,你也可以把切片的元组传递给数组索引器,它将使用沿着i轴的i切片。

def special_slice(array, topleft, bottomright):
    slices = tuple(slice(tl, br) for tl, br in zip(topleft, bottomright))
    return array[slices]

a = np.array([[1., 2., 3.],
              [4., 5., 6.],
              [7., 8., 9.]])

b = special_slice(a, (0, 1), (2, 3))
# array([[2., 3.],
#        [5., 6.]])
lfapxunr

lfapxunr2#

您可以使用常规下标。范围值只需按行和列的起始/终止对分组即可:

import numpy as np

x= np.array([[1., 2., 3.],
             [4., 5., 6.],
             [7., 8., 9.]])

top    = (0,1)
bottom = (2,3)

r0,c0,r1,c1 = *top,*bottom
y = x[r0:r1,c0:c1]

print(y)
[[2. 3.]
 [5. 6.]]

如果矩阵中的维数可变,可以使用itertools中的starmap将坐标转换为切片以进行下标:

from itertools import starmap

y = x[(*starmap(slice,zip(top,bottom)),)]

相关问题