import numpy as np
y = np.array(((1,2,3),(4,5,6),(7,8,9)))
OUTPUT:
print(y.flatten())
[1 2 3 4 5 6 7 8 9]
print(y.ravel())
[1 2 3 4 5 6 7 8 9]
Run Code Online (Sandbox Code Playgroud)
两个函数都返回相同的列表.那么两个不同功能执行相同工作的需求是什么.
我有一个清单说a = [5,3,1,4,10]
.我需要获得列表的前两个值的索引,即5和10.是否有一个python为这种情况提供的单行程?
我知道我可以像下面这样做:
import numpy as np
N=10
a=np.arange(1,100,1)
np.argsort()[-N:]
Run Code Online (Sandbox Code Playgroud)
然而,由于它做了一个完整的排序,它非常慢.
我想知道numpy是否提供了一些快速的方法.
为了找到最小值的索引,我可以使用argmin
:
import numpy as np
A = np.array([1, 7, 9, 2, 0.1, 17, 17, 1.5])
print A.argmin() # 4 because A[4] = 0.1
Run Code Online (Sandbox Code Playgroud)
但是如何找到k-最小值的指数?
我正在寻找类似的东西:
print A.argmin(numberofvalues=3)
# [4, 0, 7] because A[4] <= A[0] <= A[7] <= all other A[i]
Run Code Online (Sandbox Code Playgroud)
注意:在我的用例A中有大约10 000到100 000个值,我只对k = 10个最小值的索引感兴趣.k永远不会超过10.
如果这是一个重复的问题,我很抱歉,我查找了这些信息,但仍然无法找到它.
是否可以通过非常有效地使用递减顺序的N个最大元素的索引来排列numpy数组(或python列表)?
例如,数组:
a = array([4, 1, 0, 8, 5, 2])
Run Code Online (Sandbox Code Playgroud)
降序中最大元素的索引将给出(考虑N = 6,包括所有元素):
8 - > 3
5 - > 4
4 - > 0
2 - > 5
1 - > 1
0 - > 2
result = [3, 4, 0, 5, 1, 2]
Run Code Online (Sandbox Code Playgroud)
我知道如何使用一些有点愚蠢的方法来制作它(比如对数组进行排序并搜索其索引中的每个N个数字),但我想知道是否有任何有效的库,如瓶颈或heapq,或者可能是pythonic方法这非常快.我必须在几个阵列中应用它,每个阵列有300k元素,这就是性能问题的原因.
提前致谢!
UPDATE
我读了答案并决定使用300k的随机整数来计算它们,结果如下:
解决方案1: sorted(range(len(a)), key=lambda i:a[i])
时间: 230毫秒
解决方案2: heapq.nlargest(len(a), zip(a, itertools.count()))
时间: 396毫秒
解决方案3: heapq.nlargest(len(a), enumerate(a), key=operator.itemgetter(1))
时间: 864毫秒
解决方案4: def f(a,N): return np.argsort(a)[::-1][:N] (N = len(a))
时间:104毫秒
非常感谢快速和非常好的答案!
嗨,我有一个X值的数组,我想找到十个最小值的索引.在这个链接中,他们有效地计算了最大值,如何在numpy数组中获得N个最大值的索引? 但我不能评论链接,所以我不得不重新发布这个问题.
我不确定我需要改变哪些指数才能达到最小值而不是最大值.这是他们的代码
In [1]: import numpy as np
In [2]: arr = np.array([1, 3, 2, 4, 5])
In [3]: arr.argsort()[-3:][::-1]
Out[3]: array([4, 3, 1])
Run Code Online (Sandbox Code Playgroud) 是否有内置函数或非常简单的方法来查找列表或numpy数组中n个最大元素的索引?
K = [1,2,2,4,5,5,6,10]
Run Code Online (Sandbox Code Playgroud)
找到最大的5个元素的索引?
我不止一次地计算重复项,输出应该是那些最大数字的索引列表
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
from sklearn import linear_model
arr=['dogs cats lions','apple pineapple orange','water fire earth air', 'sodium potassium calcium']
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(arr)
feature_names = vectorizer.get_feature_names()
Y = ['animals', 'fruits', 'elements','chemicals']
T=["eating apple roasted in fire and enjoying fresh air"]
test = vectorizer.transform(T)
clf = linear_model.SGDClassifier(loss='log')
clf.fit(X,Y)
x=clf.predict(test)
#prints: elements
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,clf.predict()
仅为列表X中的样本打印1个最佳预测.我对列表X中特定样本的前3个预测感兴趣,我知道函数/ 返回列表Y中每个特征的所有概率的列表,但它必须排序然后与列表Y中的特征相关联才能获得的顶部3的结果.有没有直接有效的方法?predict_proba
predict_log_proba
在给定NumPy矩阵(2D数组)的情况下,返回数组中的最小值/最大值n
(及其索引)的有效方法是什么?
目前我有:
def n_max(arr, n):
res = [(0,(0,0))]*n
for y in xrange(len(arr)):
for x in xrange(len(arr[y])):
val = float(arr[y,x])
el = (val,(y,x))
i = bisect.bisect(res, el)
if i > 0:
res.insert(i, el)
del res[0]
return res
Run Code Online (Sandbox Code Playgroud)
这比pyopencv
生成我想要运行它的数组的图像模板匹配算法要长三倍,我认为这很愚蠢.
我想弄清楚np.partition
函数是如何工作的.例如,考虑一下
arr = np.array([ 5, 4, 1, 0, -1, -3, -4, 0])
如果我打电话np.partition(arr, kth=2)
,我得到了
np.array([-4, -3, -1, 0, 1, 4, 5, 0])
我希望在分区数组之后将分裂为少于一个,一个和更大一个元素的元素.但是第二个零位于最后一个数组位置,这在分区后不是正确的位置.
python ×10
numpy ×7
arrays ×3
performance ×2
sorting ×2
flatten ×1
list ×1
minimum ×1
optimization ×1
scikit-learn ×1