本文将为您提供关于在Numpy数组中查找多个值的详细介绍,我们还将为您解释numpy找到在数组中的位置的相关知识,同时,我们还将为您提供关于numpy:如何在numpy数组的每一列中查找第一个非零值?
本文将为您提供关于在Numpy数组中查找多个值的详细介绍,我们还将为您解释numpy找到在数组中的位置的相关知识,同时,我们还将为您提供关于numpy:如何在numpy数组的每一列中查找第一个非零值?、python – 在大型numpy数组中查找常量子数组、Python-在numpy数组中查找多个值的行索引、从多维numpy数组中查找和删除的实用信息。
本文目录一览:- 在Numpy数组中查找多个值(numpy找到在数组中的位置)
- numpy:如何在numpy数组的每一列中查找第一个非零值?
- python – 在大型numpy数组中查找常量子数组
- Python-在numpy数组中查找多个值的行索引
- 从多维numpy数组中查找和删除
在Numpy数组中查找多个值(numpy找到在数组中的位置)
我正在寻找一个numpy函数来查找在向量(xs)中找到某些值的索引。这些值在另一个数组(ys)中给出。返回的索引必须遵循ys的顺序。
在代码中,我想用numpy函数替换下面的列表理解。
>> import numpy as np>> xs = np.asarray([45, 67, 32, 52, 94, 64, 21])>> ys = np.asarray([67, 94])>> ndx = np.asarray([np.nonzero(xs == y)[0][0] for y in ys]) # <---- This line>> print(ndx)[1 4]
有没有快速的方法?
谢谢
答案1
小编典典对于大阵列xs
和ys
,你将需要改变的基本方法这成为快。如果您可以进行排序xs
,那么可以使用一个简单的方法numpy.searchsorted()
:
xs.sort()ndx = numpy.searchsorted(xs, ys)
如果保持的原始顺序很重要xs
,您也可以使用这种方法,但是您需要记住原始索引:
orig_indices = xs.argsort()ndx = orig_indices[numpy.searchsorted(xs[orig_indices], ys)]
numpy:如何在numpy数组的每一列中查找第一个非零值?
假设我有以下形式的numpy数组:
arr=numpy.array([[1,1,0],[1,[0,1],0]])
我想找到第一个索引(对于每一列)的索引,其中值非零。
因此,在这种情况下,我希望返回以下内容:
[0,2]
我该怎么办?
python – 在大型numpy数组中查找常量子数组
v = np.array([1.0,1.0,2.0,...])
我需要识别数组中的所有常量段
[{value:1.0,location:0,duration:2},..]
效率是主要指标
解决方法
def island_props(v): # Get one-off shifted slices and then compare element-wise,to give # us a mask of start and start positions for each island. # Also,get the corresponding indices. mask = np.concatenate(( [True],v[1:] != v[:-1],[True] )) loc0 = np.flatnonzero(mask) # Get the start locations loc = loc0[:-1] # The values would be input array indexe by the start locations. # The lengths woul be the differentiation between start and stop indices. return v[loc],loc,np.diff(loc0)
样品运行 –
In [143]: v Out[143]: array([ 1.,1.,2.,5.,2.]) In [144]: value,location,lengths = island_props(v) In [145]: value Out[145]: array([ 1.,2.]) In [146]: location Out[146]: array([0,2,6,7]) In [147]: lengths Out[147]: array([2,4,1,1])
运行时测试
其他方法 –
import itertools def MSeifert(a): return [{'value': k,'duration': len(list(v))} for k,v in itertools.groupby(a.tolist())] def Kasramvd(a): return np.split(v,np.where(np.diff(v) != 0)[0] + 1)
计时 –
In [156]: v0 = np.array([1.0,5.0,2.0]) In [157]: v = np.tile(v0,10000) In [158]: %timeit MSeifert(v) ...: %timeit Kasramvd(v) ...: %timeit island_props(v) ...: 10 loops,best of 3: 44.7 ms per loop 10 loops,best of 3: 36.1 ms per loop 10000 loops,best of 3: 140 µs per loop
Python-在numpy数组中查找多个值的行索引
我有一个数组X
:
X = np.array([[4, 2], [9, 3], [8, 5], [3, 3], [5, 6]])
我希望在此数组中找到多个值的行的索引:
searched_values = np.array([[4, 2], [3, 3], [5, 6]])
对于此示例,我想要一个类似的结果:
[0,3,4]
我有一个执行此操作的代码,但我认为它过于复杂:
X = np.array([[4, 2], [9, 3], [8, 5], [3, 3], [5, 6]])searched_values = np.array([[4, 2], [3, 3], [5, 6]])result = []for s in searched_values: idx = np.argwhere([np.all((X-s)==0, axis=1)])[0][1] result.append(idx)print(result)
我找到了类似问题的答案,但仅适用于一维数组。
有没有一种方法可以更简单地完成我想要的工作?
答案1
小编典典方法1
一种方法是NumPy broadcasting
像这样
np.where((X==searched_values[:,None]).all(-1))[1]
方法#2
一种内存有效的方法是将每一行转换为等效的线性索引,然后使用np.in1d,例如,
dims = X.max(0)+1out = np.where(np.in1d(np.ravel_multi_index(X.T,dims),\ np.ravel_multi_index(searched_values.T,dims)))[0]
方法3
使用np.searchsorted并具有转换为线性索引等效项的相同原理的另一种内存有效方法将是这样的-
dims = X.max(0)+1X1D = np.ravel_multi_index(X.T,dims)searched_valuesID = np.ravel_multi_index(searched_values.T,dims)sidx = X1D.argsort()out = sidx[np.searchsorted(X1D,searched_valuesID,sorter=sidx)]
请注意,此np.searchsorted方法假定searched_valuesin 中的每一行都有一个匹配项X。
np.ravel_multi_index工作如何?
此函数为我们提供了线性索引当量数。它接受,设置为列的2D数组n-dimensional indices和该n维网格本身的形状,这些索引将映射到该n维网格上并计算等效的线性索引。
让我们使用针对当前问题的输入。以输入为例,X并注意输入的第一行。由于我们正在尝试将的每一行X转换为其等效的线性索引,并且由于np.ravel_multi_index将每一列都假定为一个索引元组,因此我们需要X在转入函数之前进行转置。由于X在这种情况下每行元素的数量为2,因此要映射到的n维网格将为2D。每行中有3个元素X,它本来是3D用于映射的网格,依此类推。
要查看此功能将如何计算线性指标,考虑的第一行X
In [77]: XOut[77]: array([[4, 2], [9, 3], [8, 5], [3, 3], [5, 6]])
我们将n维网格的形状设为dims
In [78]: dimsOut[78]: array([10, 7])
让我们创建一个二维网格,以查看该映射如何工作以及如何使用np.ravel_multi_index
计算线性索引
In [79]: out = np.zeros(dims,dtype=int)In [80]: outOut[80]: array([[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]])
让我们从设置第一个索引元组X,即从X网格开始的第一行-
In [81]: out[4,2] = 1In [82]: outOut[82]: array([[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]])
现在,要查看刚设置的元素的线性索引等效项,我们将其展平并用于np.where
检测1。
In [83]: np.where(out.ravel())[0]Out[83]: array([30])
如果考虑行优先排序,也可以计算得出。
让我们使用np.ravel_multi_index
并验证这些线性指标-
In [84]: np.ravel_multi_index(X.T,dims)Out[84]: array([30, 66, 61, 24, 41])
因此,我们将具有对应于from中每个索引元组X(即from中的每一行)的线性索引X。
选择尺寸np.ravel_multi_index
以形成唯一的线性索引
现在,将每行X作为n维网格的索引元组并将每个这样的元组转换为标量的想法是要具有与唯一元组相对应的唯一标量,即中的唯一行X。
让我们再来看一看X
In [77]: XOut[77]: array([[4, 2], [9, 3], [8, 5], [3, 3], [5, 6]])
现在,如前一节所述,我们将每一行都视为索引元组。在每个这样的索引元组中,第一个元素将代表n-dim
网格的第一个轴,第二个元素将是网格的第二个轴,依此类推,直到中的每一行的最后一个元素X
。本质上,每一列将代表网格的一个维度或轴。如果我们要将所有元素映射X到同一n-dim网格,则需要考虑这样一个建议的n-dim网格的每个轴的最大拉伸。假设我们在中处理正数X,则这样的延展将是X+ 1
中每一列的最大值。这+ 1是因为Python遵循0-based
索引。因此,例如,X[1,0] == 9
将映射到第十行拟议的网格。同样,X[4,1] == 6
将转到7th该网格的列。
因此,对于我们的示例案例,我们有-
In [7]: dims = X.max(axis=0) + 1 # Or simply X.max(0) + 1In [8]: dimsOut[8]: array([10, 7])
因此,(10,7)
对于样本盒,我们将需要至少一个形状为的网格。沿尺寸的更多长度不会受到损害,并且也会为我们提供独特的线性指标。
结束语:这里要注意的一件重要事情是,如果我们有负数X,则需要在每列中添加适当的偏移量,X以使使用索引的那些元组成为正数np.ravel_multi_index
。
从多维numpy数组中查找和删除
我有两个numpy数组:
p_a_colors=np.array([[0,0,0], [0,2,0], [119,103,82], [122,122,122], [122,122,122], [3,2,4]])p_rem = np.array([[119,103,82], [122,122,122]])
我想从p_rem中的p_a_colors中删除所有列,所以我得到:
p_r_colors=np.array([[0,0,0], [0,2,0], [3,2,4]])
我认为,某些事情应该像
p_r_colors= np.delete(p_a_colors, np.where(np.all(p_a_colors==p_rem, axis=0)),0)
但我只是不知道轴或[:]正确。
我知道
p_r_colors=copy.deepcopy(p_a_colors)for i in range(len(p_rem)): p_r_colors= np.delete(p_r_colors, np.where(np.all(p_r_colors==p_rem[i], axis=-1)),0)
可以,但是我试图避免(python)循环,因为我也想要正确的性能。
答案1
小编典典这就是我要做的:
dtype = np.dtype((np.void, (p_a_colors.shape[1] * p_a_colors.dtype.itemsize)))mask = np.in1d(p_a_colors.view(dtype), p_rem.view(dtype))p_r_colors = p_a_colors[~mask]>>> p_r_colorsarray([[0, 0, 0], [0, 2, 0], [3, 2, 4]])
您需要执行void dtype事情,以便numpy整体比较行。之后,使用内置的set例程似乎是显而易见的方法。
今天关于在Numpy数组中查找多个值和numpy找到在数组中的位置的分享就到这里,希望大家有所收获,若想了解更多关于numpy:如何在numpy数组的每一列中查找第一个非零值?、python – 在大型numpy数组中查找常量子数组、Python-在numpy数组中查找多个值的行索引、从多维numpy数组中查找和删除等相关知识,可以在本站进行查询。
本文标签: