Numpy 连接列表,其中第一列在 n 范围内
Numpy concatenate lists where first column is in range n
我正在尝试 select 名为 matrix
且形状为 (25323, 9)
的 numpy 矩阵中的所有行,其中第一列的值在 [=13= 的范围内] 和 end
列表 range_tuple
上的每个元组。最终,我想创建一个新的 numpy 矩阵,结果 final
的形状为 (n, 9)
。下面代码returns这个错误:TypeError: only integer scalar arrays can be converted to a scalar index
。我也尝试用 numpy.zeros((1,9))
初始化 final
并使用 np.concatenate
但得到类似的结果。当我使用 final.append(result)
而不是使用 np.concatenate
时,我确实得到了编译结果,但矩阵的形状丢失了。我知道这个问题有一个合适的解决方案,任何帮助将不胜感激。
final = []
for i in range_tuples:
copy = np.copy(matrix)
start = i[0]
end = i[1]
result = copy[(matrix[:,0] < end) & (matrix[:,0] > start)]
final = np.concatenate(final, result)
final = np.matrix(final)
尝试以下方法
final = np.empty((0,9))
for start, stop in range_tuples:
result = matrix[(matrix[:,0] < end) & (matrix[:,0] > start)]
final = np.concatenate((final, result))
首先是将final
初始化为一个numpy数组。连接的第一个参数必须是数组的 python 列表,请参阅 docs。在您的代码中,它将 result
变量解释为参数 axis
的值
注释
- 我使用元组解构来使循环更清晰
- 不需要副本
- 附加列表可以更快。如果
result
总是相同的长度,则可以通过reshaping获得最终结果。
我会简单地为满足要求条件的 select 行创建一个布尔掩码。
编辑:我错过了您正在使用 matrix
(与 ndarray
相反)。 matrix
.
的答案已编辑
假设输入数据如下:
matrix = np.matrix([[1, 2, 3], [5, 6, 7], [2, 1, 7], [3, 4, 5], [8, 9, 0]])
range_tuple = [(0, 2), (1, 4), (1, 9), (5, 9), (0, 100)]
然后,首先,我会将 range_tuple
转换为 numpy.ndarray
:
range_mat = np.matrix(range_tuple)
现在,创建蒙版:
mask = np.ravel((matrix[:, 0] > range_mat[:, 0]) & (matrix[:, 0] < range_mat[:, 1]))
敷面膜:
final = matrix[mask] # or matrix[mask].copy() if you intend to modify matrix
检查:
print(final)
[[1 2 3]
[2 1 7]
[8 9 0]]
如果 range_tuple
的长度与 matrix
中的行数 不同 ,则执行此操作:
n = min(range_mat.shape[0], matrix.shape[0])
mask = np.pad(
np.ravel(
(matrix[:n, 0] > range_mat[:n, 0]) & (matrix[:n, 0] < range_mat[:n, 1])
),
(0, matrix.shape[0] - n)
)
final = matrix[mask]
In [33]: arr
Out[33]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23]])
In [34]: tups = [(0,6),(3,12),(9,10),(15,14)]
In [35]: alist=[]
...: for start, stop in tups:
...: res = arr[(arr[:,0]<stop)&(arr[:,0]>=start), :]
...: alist.append(res)
...:
查看列表;请注意,元素的形状不同;有些是 1 或 0 行。测试这些边缘情况是个好主意。
In [37]: alist
Out[37]:
[array([[0, 1, 2],
[3, 4, 5]]), array([[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]]), array([[ 9, 10, 11]]), array([], shape=(0, 3), dtype=int64)]
vstack
加入他们:
In [38]: np.vstack(alist)
Out[38]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[ 9, 10, 11]])
这里concatenate
也可以,因为默认轴是0,所有输入都已经是2d了。
我正在尝试 select 名为 matrix
且形状为 (25323, 9)
的 numpy 矩阵中的所有行,其中第一列的值在 [=13= 的范围内] 和 end
列表 range_tuple
上的每个元组。最终,我想创建一个新的 numpy 矩阵,结果 final
的形状为 (n, 9)
。下面代码returns这个错误:TypeError: only integer scalar arrays can be converted to a scalar index
。我也尝试用 numpy.zeros((1,9))
初始化 final
并使用 np.concatenate
但得到类似的结果。当我使用 final.append(result)
而不是使用 np.concatenate
时,我确实得到了编译结果,但矩阵的形状丢失了。我知道这个问题有一个合适的解决方案,任何帮助将不胜感激。
final = []
for i in range_tuples:
copy = np.copy(matrix)
start = i[0]
end = i[1]
result = copy[(matrix[:,0] < end) & (matrix[:,0] > start)]
final = np.concatenate(final, result)
final = np.matrix(final)
尝试以下方法
final = np.empty((0,9))
for start, stop in range_tuples:
result = matrix[(matrix[:,0] < end) & (matrix[:,0] > start)]
final = np.concatenate((final, result))
首先是将final
初始化为一个numpy数组。连接的第一个参数必须是数组的 python 列表,请参阅 docs。在您的代码中,它将 result
变量解释为参数 axis
注释
- 我使用元组解构来使循环更清晰
- 不需要副本
- 附加列表可以更快。如果
result
总是相同的长度,则可以通过reshaping获得最终结果。
我会简单地为满足要求条件的 select 行创建一个布尔掩码。
编辑:我错过了您正在使用 matrix
(与 ndarray
相反)。 matrix
.
假设输入数据如下:
matrix = np.matrix([[1, 2, 3], [5, 6, 7], [2, 1, 7], [3, 4, 5], [8, 9, 0]])
range_tuple = [(0, 2), (1, 4), (1, 9), (5, 9), (0, 100)]
然后,首先,我会将 range_tuple
转换为 numpy.ndarray
:
range_mat = np.matrix(range_tuple)
现在,创建蒙版:
mask = np.ravel((matrix[:, 0] > range_mat[:, 0]) & (matrix[:, 0] < range_mat[:, 1]))
敷面膜:
final = matrix[mask] # or matrix[mask].copy() if you intend to modify matrix
检查:
print(final)
[[1 2 3]
[2 1 7]
[8 9 0]]
如果 range_tuple
的长度与 matrix
中的行数 不同 ,则执行此操作:
n = min(range_mat.shape[0], matrix.shape[0])
mask = np.pad(
np.ravel(
(matrix[:n, 0] > range_mat[:n, 0]) & (matrix[:n, 0] < range_mat[:n, 1])
),
(0, matrix.shape[0] - n)
)
final = matrix[mask]
In [33]: arr
Out[33]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23]])
In [34]: tups = [(0,6),(3,12),(9,10),(15,14)]
In [35]: alist=[]
...: for start, stop in tups:
...: res = arr[(arr[:,0]<stop)&(arr[:,0]>=start), :]
...: alist.append(res)
...:
查看列表;请注意,元素的形状不同;有些是 1 或 0 行。测试这些边缘情况是个好主意。
In [37]: alist
Out[37]:
[array([[0, 1, 2],
[3, 4, 5]]), array([[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]]), array([[ 9, 10, 11]]), array([], shape=(0, 3), dtype=int64)]
vstack
加入他们:
In [38]: np.vstack(alist)
Out[38]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[ 9, 10, 11]])
这里concatenate
也可以,因为默认轴是0,所有输入都已经是2d了。