Numpy 切片 python 3
Numpy slicing python 3
我有 4 个阵列。 数组 X:是包含示例的二维数组(每个都有 3 个特征):
X = array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21]])
数组 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
)。
我想要 python 3 中的有效解决方案来做到这一点。有什么提示吗?
这就是你通常的做法:
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])
希望这对您有所帮助:)
使用np.isin
:
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])
我有 4 个阵列。 数组 X:是包含示例的二维数组(每个都有 3 个特征):
X = array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21]])
数组 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
)。
我想要 python 3 中的有效解决方案来做到这一点。有什么提示吗?
这就是你通常的做法:
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])
希望这对您有所帮助:)
使用np.isin
:
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])