Numpy切片python 3

Numpy切片python 3,python,arrays,python-3.x,numpy,object-slicing,Python,Arrays,Python 3.x,Numpy,Object Slicing,我有4个数组阵列X:是包含示例的二维阵列(每个示例有3个功能): 数组Y包含数组X中示例的标签: Y = array([11, 44, 77, 22, 77, 22, 22]) 数组L&R包含标签的子集 L = array([11, 44]) R = array([77, 22]) 我想根据L和R中的标签对X和Y进行切片。因此输出应该是: XL = array([[1, 2, 3], [4, 5, 6]]) XR = array([[7, 8, 9], [10, 11, 12], [13,

我有4个数组阵列X:是包含示例的二维阵列(每个示例有3个功能):

数组Y包含数组X中示例的标签:

Y = array([11, 44, 77, 22, 77, 22, 22])
数组L&R包含标签的子集

L = array([11, 44])
R = array([77, 22])
我想根据L和R中的标签对X和Y进行切片。因此输出应该是:

XL = array([[1, 2, 3], [4, 5, 6]])
XR = array([[7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21]])
YL = array([11, 44])
YR = array([77, 22, 77, 22, 22])
我知道在基于值时,我可以执行以下操作来提取所需的行:

Y[Y==i]
X[Y[Y==i], :] 
然而,
i
这里是一个值,但在我的问题中它是另一个数组(例如,
L
R
)。

我希望Python3中有一个高效的解决方案来实现这一点。有什么提示吗?

您通常会这样做:

from numpy import array

X = array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21]])
Y = array([11, 44, 77, 22, 77, 22, 22])

L = array([11, 44])
R = array([77, 22])

XL = array([x for x, y in zip(X, Y) if y in L])
XR = array([x for x, y in zip(X, Y) if y in R])
YL = array([y for y in Y if y in L])
YR = array([y for y in Y if y in R])

# Output
# XL = array([[1, 2, 3], [4, 5, 6]])
# XR = array([[7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21]])
# YL = array([11, 44])
# YR = array([77, 22, 77, 22, 22])

希望这有帮助:)

这就是你通常的做法:

from numpy import array

X = array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21]])
Y = array([11, 44, 77, 22, 77, 22, 22])

L = array([11, 44])
R = array([77, 22])

XL = array([x for x, y in zip(X, Y) if y in L])
XR = array([x for x, y in zip(X, Y) if y in R])
YL = array([y for y in Y if y in L])
YR = array([y for y in Y if y in R])

# Output
# XL = array([[1, 2, 3], [4, 5, 6]])
# XR = array([[7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21]])
# YL = array([11, 44])
# YR = array([77, 22, 77, 22, 22])
希望这有帮助:)

使用:

使用:


什么样的标签是
44
77
?您的意思是将其用作
X[3,3]
X[6,6]
?这不是所谓的切片。它的布尔索引,完全不同。。。除非您的标签是以一种非常特殊的方式组织的,否则您不能仅仅使用切片。Kounis这些值对应于某种类型的类。可能还有其他标签,如55、66、99等@Julien我明白了!那么,有没有一种方法可以使用布尔索引实现我想要的功能呢?是的,它看起来就像你刚才做的一样,如果你对你的代码不满意,你需要分享它,并解释你到底不满意什么……什么样的标签是
44
77
?您的意思是将其用作
X[3,3]
X[6,6]
?这不是所谓的切片。它的布尔索引,完全不同。。。除非您的标签是以一种非常特殊的方式组织的,否则您不能仅仅使用切片。Kounis这些值对应于某种类型的类。可能还有其他标签,如55、66、99等@Julien我明白了!那么,有没有一种方法可以使用布尔索引实现我想要的功能呢?是的,它看起来就像你刚才所做的那样,如果你对代码不满意,你需要分享它,并解释你到底不满意什么……虽然这是“干净方便的”,但在大数据上可能相当慢,因为它在python中大量循环而不是使用numpy矢量化…虽然这是“干净和方便的”,但在大数据上可能相当慢,因为它在python中大量循环而不是使用numpy矢量化。。。
import numpy as np

X = np.asarray([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21]])
Y = np.asarray([11, 44, 77, 22, 77, 22, 22])

L = np.asarray([11, 44])
R = np.asarray([77, 22])

mask_L = np.isin(Y, L)
mask_R = np.isin(Y, R)

print(X[mask_L,:])  # output: array([[1, 2, 3], [4, 5, 6]])

print(X[mask_R,:])  # output: array([[ 7,  8,  9], [10, 11, 12], 13, 14, 15], 16, 17, 18], 19, 20, 21]])

print(Y[mask_L])  # output: array([11, 44])

print(Y[mask_R])  # output: array([77, 22, 77, 22, 22])