Python Numpy串联列表,其中第一列在范围n中

Python Numpy串联列表,其中第一列在范围n中,python,numpy,vectorization,Python,Numpy,Vectorization,我试图选择名为matrix且形状(25323,9)的numpy矩阵中的所有行,其中第一列的值在列表range\u tuple上每个元组的start和end范围内。最后,我想创建一个新的numpy矩阵,其结果是final的形状为(n,9)。以下代码返回此错误:TypeError:只有整数标量数组才能转换为标量索引。我还尝试过用numpy.zero((1,9))初始化final,并使用np.concatenate但得到了类似的结果。当我使用final.append(result)而不是使用np.co

我试图选择名为
matrix
且形状
(25323,9)
的numpy矩阵中的所有行,其中第一列的值在列表
range\u tuple
上每个元组的
start
end
范围内。最后,我想创建一个新的numpy矩阵,其结果是
final
的形状为
(n,9)
。以下代码返回此错误:
TypeError:只有整数标量数组才能转换为标量索引
。我还尝试过用
numpy.zero((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=[]
对于范围内的i_元组:
复制=np.复制(矩阵)
start=i[0]
end=i[1]
结果=复制[(矩阵[:,0]start)]
final=np.连接(final,result)
最终=np.矩阵(最终)
尝试以下操作

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=np.空((0,9))
对于“开始”,在“范围”元组中停止:
结果=矩阵[(矩阵[:,0]start)]
final=np.连接((final,result))
第一个是将
final
初始化为numpy数组。连接的第一个参数必须是数组的python列表,请参见。在代码中,它将
结果
变量解释为参数
轴的值

注释

  • 我使用元组解构来让循环更清晰
  • 不需要复印件
  • 附加列表可以更快。如果
    结果
    的长度始终相同,则可通过以下方式获得最终结果
尝试以下方法

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=np.空((0,9))
对于“开始”,在“范围”元组中停止:
结果=矩阵[(矩阵[:,0]start)]
final=np.连接((final,result))
第一个是将
final
初始化为numpy数组。连接的第一个参数必须是数组的python列表,请参见。在代码中,它将
结果
变量解释为参数
轴的值

注释

  • 我使用元组解构来让循环更清晰
  • 不需要复印件
  • 附加列表可以更快。如果
    结果
    的长度始终相同,则可通过以下方式获得最终结果

我只需创建一个布尔掩码来选择满足所需条件的行

编辑:我没有注意到您正在使用
matrix
(与
ndarray
相反)。已为
矩阵
编辑答案

假设以下输入数据:

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\u 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\u tuple
的长度可能与
矩阵中的行数不同,则执行以下操作:

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]
n=min(范围材料形状[0],矩阵形状[0])
掩码=np.pad(
拉威尔(
(矩阵[:n,0]>范围矩阵[:n,0])和(矩阵[:n,0]<范围矩阵[:n,1])
),
(0,矩阵形状[0]-n)
)
最终=矩阵[遮罩]

我只需创建一个布尔掩码来选择满足所需条件的行

编辑:我没有注意到您正在使用
matrix
(与
ndarray
相反)。已为
矩阵
编辑答案

假设以下输入数据:

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\u 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\u tuple
的长度可能与
矩阵中的行数不同,则执行以下操作:

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]
n=min(范围材料形状[0],矩阵形状[0])
掩码=np.pad(
拉威尔(
(矩阵[:n,0]>范围矩阵[:n,0])和(矩阵[:n,0]<范围矩阵[:n,1])
),
(0,矩阵形状[0]-n)
)
最终=矩阵[遮罩]
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,并且所有输入都已经是二维的

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]])

在这里,
串联
也起作用,因为默认轴为0,并且所有输入都已经是2d。

串联
获取数组列表和轴编号。你试着给它两个数组。它反对使用第二个数组作为数字。哦,不要像这样使用
串联
。它很慢,很难初始化。使用列表附加。为了清楚起见,每个
结果将是(n1,9)形状,其中
n1
可以不同?你希望结果是一(n,9),其中
n
是所有这些
n1
的总和?您是否尝试加入数组列表?
concatenate
获取数组列表和轴编号。你试着给它两个数组。它反对使用第二个数组作为数字。哦,不要像这样使用
串联
。它很慢,很难初始化。使用列表附加。为了清楚起见,每个
结果将是(n1,9)形状,其中
n1
可以不同?你希望结果是一(n,9),其中
n
是所有这些
n1
的总和?您是否尝试过
vstack
加入阵列列表?太好了。非常感谢。完美的非常感谢。