使用列表推导创建numPy数组

时间:2016-12-08 09:28:49

标签: python arrays numpy list-comprehension

假设我有两个numPy数组arr1arr2

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数组。

提前致谢。

2 个答案:

答案 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]])