计算numpy数组中的值并按结果返回索引

时间:2018-02-20 13:41:10

标签: python python-3.x numpy

我有一个2d numpy数组my_array,它的开头是这样的:

array([[1., 2., 3., 4., 5., 6., 7., 8., 9.],
       [1., 2., 3., 4., 5., 6., 7., 8., 9.],
       [1., 2., 3., 4., 5., 6., 7., 8., 9.],
       [1., 2., 3., 4., 5., 6., 7., 8., 9.],
       [1., 2., 3., 4., 5., 6., 7., 8., 9.],
       [1., 2., 3., 4., 5., 6., 7., 8., 9.],
       [1., 2., 3., 4., 5., 6., 7., 8., 9.],
       [1., 2., 3., 4., 5., 6., 7., 8., 9.],
       [1., 2., 3., 4., 5., 6., 7., 8., 9.]])

但经过一些无关紧要的处理后,现在看起来像这样:

array([[1., 2., 0., 4., 5., 6., 0., 8., 9.],
       [0., 2., 0., 0., 5., 6., 7., 8., 9.],
       [0., 2., 0., 4., 5., 0., 7., 0., 9.],
       [1., 2., 0., 4., 5., 6., 7., 8., 9.],
       [1., 2., 3., 4., 5., 0., 7., 8., 9.],
       [0., 2., 0., 4., 5., 6., 0., 8., 9.],
       [1., 2., 0., 4., 5., 6., 7., 8., 9.],
       [1., 2., 0., 4., 5., 6., 7., 8., 9.],
       [1., 2., 0., 4., 5., 6., 7., 8., 0.]])

正如您所看到的,有些项目已经被淘汰了#34;相当随机,但只留下3的值,只有1个项目不为零。我正在寻找一个获取此数组的函数,并返回值为3的索引/行号(或者只在数组中出现一次且仅出现一次的任何其他值)。

以不同的方式解释:

我首先要弄清楚是否有这样的项目只出现一次(在这个例子中答案是肯定的,那个项目是数字3),然后我需要返回它的行号(在这种情况下4,因为3中唯一包含my_array[4]的行是:0

我已经成功完成了迭代数组,逐项,并计算每个数字出现的次数(并仅返回计数为1的项目),然后再次迭代所有数据以找到正确的数字该项目所在的索引/行号。

这似乎非常低效,特别是如果阵列会更大。 numpy有更好的方法吗?

编辑:如果只出现一次的<?PHP $url="http://tgftp.nws.noaa.gov/data/observations/metar/stations/KJFK.TXT"; $info=file_get_contents($url); $url_info = "http://username:password@icecast:8000/admin/metadata?mount=/mymount&mode=updinfo&song=" . urlencode($info); // create a new cURL resource $ch = curl_init(); // set URL and other appropriate options curl_setopt($ch, CURLOPT_URL, $url_info); curl_setopt($ch, CURLOPT_HEADER, 0); // grab URL and pass it to the browser curl_exec($ch); // close cURL resource, and free up system resources curl_close($ch); ?> 数不应该计算,我只会查找&#34;列&#34;完全归零,除了其中的1个项目

2 个答案:

答案 0 :(得分:3)

尝试使用numpy.count_nonzero方法

numpy.count_nonzero(arr, axis=0)

这将按列计数非零值
这是Demo

我会把剩下的留给你。祝你好运

答案 1 :(得分:2)

编辑我甚至不使用面具,你可以使用第一行和最后一行:

x = np.array([[1., 2., 0., 4., 5., 6., 0., 8., 9.],
       [0., 2., 0., 0., 5., 6., 7., 8., 9.],
       [0., 2., 0., 4., 5., 0., 7., 0., 9.],
       [1., 2., 0., 4., 5., 6., 7., 8., 9.],
       [1., 2., 3., 4., 5., 0., 7., 8., 9.],
       [0., 2., 0., 4., 5., 6., 0., 8., 9.],
       [1., 2., 0., 4., 5., 6., 7., 8., 9.],
       [1., 2., 0., 4., 5., 6., 7., 8., 9.],
       [1., 2., 0., 4., 5., 6., 7., 8., 0.]])

res = (x == 3)
print(np.where(res * x)[0])

输出:

[4]

np.where()的完整回复是:

(array([4], dtype=int64), array([2], dtype=int64))

因此,如果你想要列和行号,你可以同时使用这两个。