假设我有两个numPy数组arr1
和arr2
:
arr1 = np.random.randint(3, size = 100)
arr2 = np.random.randint(3, size = 100)
我想建立一个包含联合事件数量的矩阵。
换句话说,对于arr1
的所有0的值,找到arr2
中也为0且位于相同位置的元素。所以,我想得到以下矩阵:
M = [[p(0,0), p(0,1), p(0,2)],
[p(1,0), p(1,1), p(1,2)],
[p(2,0), p(2,1), p(2,2)]]
其中p(0,0)
代表arr1
上的0和arr2
上的0的出现次数。
首次尝试:
作为第一次尝试,我尝试了以下内容:
[[sum(arr1[arr2 == y] == x) for x in np.arange(0,3)] for y in np.arange(0,3)]
但是python会抛出以下错误:
NameError: name 'arr1' is not defined
第二次尝试:
我试图通过使用for循环来挖掘这个错误:
M = np.array([])
for x in np.arange(0,dim):
result = np.array([])
for y in np.arange(0,dim):
result_temp = sum(arr1[arr2 == x] == y)
result = np.append(result, result_temp)
M = np.append(M,result)
在这种情况下,Python不会抛出先前的错误,但是我没有获得3x3数组,而是获得1x9数组,而且我无法获得所需的3x3数组。
提前致谢。
答案 0 :(得分:3)
您的第一个列表理解有效。如果定义#!/bin/bash
DEBUG_PORT=7777
SOURCE_PATH=app/src/main/java
FILE=/var/tmp/andebug-$(date +%s)
adb jdwp > "$FILE" &
sleep 1
kill -9 $!
JDWP_ID=$(tail -1 "$FILE")
rm "$FILE"
adb forward tcp:$DEBUG_PORT jdwp:$JDWP_ID
jdb -sourcepath $SOURCE_PATH -attach localhost:$DEBUG_PORT
,您将无法获得NameError
:
arr1
但您可以使用np.histogram2d
:
import numpy as np
np.random.seed(2016)
arr1 = np.random.randint(3, size = 100)
arr2 = np.random.randint(3, size = 100)
result = [[sum(arr1[arr2 == y] == x) for x in np.arange(0,3)]
for y in np.arange(0,3)]
print(result)
# [[10, 9, 10], [8, 13, 15], [18, 8, 9]]
产量
result2, xedges, yedges = np.histogram2d(arr2, arr1, bins=range(4))
print(result2)
答案 1 :(得分:2)
为了表现,我想建议np.bincount
-
N = 3 # Number of integers to cover
out = np.bincount(arr2*N + arr1, minlength=N*N).reshape(N,N)
示例运行 -
In [50]: arr1 = np.random.randint(3, size = 100)
...: arr2 = np.random.randint(3, size = 100)
...:
In [51]: N = 3 # Number of integers to cover
In [52]: np.bincount(arr2*N + arr1, minlength=N*N).reshape(N,N)
Out[52]:
array([[12, 10, 12],
[ 7, 6, 20],
[ 5, 13, 15]])