我有一个形状为(30,480,640)的numpy ndarray,第1和第2轴代表位置(纬度和长度),第0轴包含实际数据点。我想在每个第0轴使用最频繁的值location,用于构造一个形状为(1,480,640).ie的新数组:
>>> data
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[40, 40, 42, 43, 44],
[45, 46, 47, 48, 49],
[50, 51, 52, 53, 54],
[55, 56, 57, 58, 59]]])
(perform calculation)
>>> new_data
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]]])
数据点将包含负数和正数浮点数。我该如何进行这样的计算?非常感谢!
我尝试使用numpy.unique,但我得到了“TypeError:unique()得到了一个意外的关键字参数'return_inverse'”。我在Unix上安装了numpy版本1.2.1并且它不支持return_inverse ..我也试过模式,但是处理如此大量的数据需要永远...所以有没有另一种方法来获得最频繁的值?再次感谢。
答案 0 :(得分:17)
要查找平面数组的最常用值,请使用unique
,bincount
和argmax
:
arr = np.array([5, 4, -2, 1, -2, 0, 4, 4, -6, -1])
u, indices = np.unique(arr, return_inverse=True)
u[np.argmax(np.bincount(indices))]
要使用多维数组,我们无需担心unique
,但我们需要在apply_along_axis
上使用bincount
:
arr = np.array([[5, 4, -2, 1, -2, 0, 4, 4, -6, -1],
[0, 1, 2, 2, 3, 4, 5, 6, 7, 8]])
axis = 1
u, indices = np.unique(arr, return_inverse=True)
u[np.argmax(np.apply_along_axis(np.bincount, axis, indices.reshape(arr.shape),
None, np.max(indices) + 1), axis=axis)]
使用您的数据:
data = np.array([
[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[40, 40, 42, 43, 44],
[45, 46, 47, 48, 49],
[50, 51, 52, 53, 54],
[55, 56, 57, 58, 59]]])
axis = 0
u, indices = np.unique(arr, return_inverse=True)
u[np.argmax(np.apply_along_axis(np.bincount, axis, indices.reshape(arr.shape),
None, np.max(indices) + 1), axis=axis)]
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
NumPy 1.2,真的吗?您可以使用np.unique(return_inverse=True)
(它是一个额外的O( n log n )来合理有效地估算np.searchsorted
,因此不应该显着改变性能) :
u = np.unique(arr)
indices = np.searchsorted(u, arr.flat)
答案 1 :(得分:5)
使用SciPy的模式功能:
import numpy as np
from scipy.stats import mode
data = np.array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[40, 40, 42, 43, 44],
[45, 46, 47, 48, 49],
[50, 51, 52, 53, 54],
[55, 56, 57, 58, 59]]])
print data
# find mode along the zero-th axis; the return value is a tuple of the
# modes and their counts.
print mode(data, axis=0)
答案 2 :(得分:0)
flatten
您的数组,然后从中构建collections.Counter
。像往常一样,在比较浮点数时要特别小心。
答案 3 :(得分:0)
解释@ecatmurs部分
u[np.argmax(np.apply_along_axis(np.bincount, axis, indices.reshape(arr.shape),
None, np.max(indices) + 1), axis=axis)]
多一点,并在重新阅读时进行简化以使其更简洁(因为我使用了此解决方案,几周后我想知道此函数中发生了什么):
axis = 0
uniques, indices = np.unique(arr, return_inverse=True)
args_for_bincount_fn = None, np.max(indices) + 1
binned_indices = np.apply_along_axis(np.bincount,
last_axis,
indices.reshape(arr.shape),
*args_for_bincount_fn)
most_common = uniques[np.argmax(binned_indices,axis=axis)]
答案 4 :(得分:0)
以下是我认为更好的解决方案
tmpL = np.array([3, 2, 3, 2, 5, 2, 2, 3, 3, 2, 2, 2, 3, 3, 2, 2, 3, 2, 3, 2])
unique, counts = np.unique(tmpL, return_counts=True)
return unique[np.argmax(counts)]
使用np.unique
,我们可以获得每个唯一元素的计数。 counts
中max元素的索引将是unique
中相应的元素。