Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy 沿列查找数组模式的最佳方法_Numpy_Numpy Ndarray - Fatal编程技术网

Numpy 沿列查找数组模式的最佳方法

Numpy 沿列查找数组模式的最佳方法,numpy,numpy-ndarray,Numpy,Numpy Ndarray,假设我有一个数组 a = np.array([[1,2.5,3,4],[1, 2.5, 3,3]]) 我想在不使用stats.mode()的情况下查找每列的模式 我能想到的唯一办法是: result = np.zeros(a.shape[1]) for i in range(len(result)): curr_col = a[:,i] result[i] = curr_col[np.argmax(np.unique(curr_col, return_counts = True

假设我有一个数组

a = np.array([[1,2.5,3,4],[1, 2.5, 3,3]])
我想在不使用stats.mode()的情况下查找每列的模式

我能想到的唯一办法是:

result = np.zeros(a.shape[1])
for i in range(len(result)):
    curr_col = a[:,i]
    result[i] = curr_col[np.argmax(np.unique(curr_col, return_counts = True))]
更新: 上述代码中存在一些错误,正确的代码应为:

   values, counts = np.unique(a[:,i], return_counts = True)
   result[i] = values[np.argmax(counts)]
我必须使用循环,因为np.unique不会为每个列输出兼容的结果,并且无法使用
np.bincount
,因为数据类型不是int。

如果查看,此函数将返回值和相关计数(因为您指定了
return\u counts=True
)。要得到正确的结果,需要对代码稍加修改。您要做的是查找与最高计数关联的值:

import numpy as np
a = np.array([[1,5,3,4],[1,5,3,3],[1,5,3,3]])
result = np.zeros(a.shape[1])
for i in range(len(result)):
  values, counts = np.unique(a[:,i], return_counts = True)
  result[i] = values[np.argmax(counts)]
print(result)
输出:

% python3 script.py
[1. 5. 3. 4.]
% python3 script.py
Timer 1:  0.002721071243286133 s
Timer 2:  0.003339052200317383 s
Matrices are equal!
以下是将您的解决方案与函数进行比较的代码:

import numpy as np
import scipy.stats as sps
import time

a = np.random.randint(1,100,(100,100))

t_start = time.time()
result = np.zeros(a.shape[1])
for i in range(len(result)):
  values, counts = np.unique(a[:,i], return_counts = True)
  result[i] = values[np.argmax(counts)]
print('Timer 1: ', (time.time()-t_start), 's')

t_start = time.time()
result_2 = sps.mode(a, axis=0).mode
print('Timer 2: ', (time.time()-t_start), 's')

print('Matrices are equal!' if np.allclose(result, result_2) else 'Matrices differ!')
输出:

% python3 script.py
[1. 5. 3. 4.]
% python3 script.py
Timer 1:  0.002721071243286133 s
Timer 2:  0.003339052200317383 s
Matrices are equal!

我尝试了几个参数值,您的代码实际上比scipy.stats.mode函数快,所以它可能接近最优。

如果您尝试使用
a=np.array([[1,5,3,4],[1,5,3,3],[1,5,3,3])
您将得到
结果=[1.5.3.4]
,这是不正确的。最后一列模式是3。感谢您指出这一点,现在应该是正确的。谢谢!!!这是一个非常彻底的回答。在判断代码是否可以优化时,你知道什么是好的经验法则吗?我是numpy的新手,所以每次我写一段代码时,我都开始担心它是否有效,但我就是没有好的方法来判断。不客气。我认为这是一个非常困难的问题。通常,根据应用程序的不同,您应该在计算时间可以接受时立即停止优化,因为优化通常意味着代码的复杂化。然而,您有一个良好的心态,因为您应该始终担心代码的效率。如果回到上面的代码,优化主要在于np.unique函数,该函数可能使用一些树结构来执行未排序数组的计数。例如,如果您的数组已排序,则可能会运行得更快。您可以开始实现一个有效的代码。通常可以将问题分解为已知的子问题,就像您在这里使用np.unique时所做的那样。您可能总是关注复杂性而不是计算时间:这里np.unique对于未排序的数组有一个O(N log(N)),对于排序的数组有一个O(N),对于排序后的数组更容易计算计数。如果您正在处理大量数据(如果
a
是一个大小为1000000000的矩阵),那么下一步可能是在多个CPU或GPU上进行并行化,但这将使代码复杂化很多。