Python 更新条件给定的行和列的数组值

Python 更新条件给定的行和列的数组值,python,arrays,matlab,numpy,multidimensional-array,Python,Arrays,Matlab,Numpy,Multidimensional Array,我有以下两个阵列: a = np.mat('5;5;1;4;3;2;1;5;3') b = np.zeros((9,9)) 数组a是一个簇分配,其中每个对象(由一行表示)分配给给定簇(由一个数字表示)。我有多个这样的集群分配,我想在数组b中计算每对对象在同一集群中同时出现的频率。在Matlab中,我将编写如下内容: b(a==5,a==5) = b(a==5,a==5) + 1 产出将是: b = 1 1 0 0 0 0 0

我有以下两个阵列:

a = np.mat('5;5;1;4;3;2;1;5;3')
b = np.zeros((9,9))
数组
a
是一个簇分配,其中每个对象(由一行表示)分配给给定簇(由一个数字表示)。我有多个这样的集群分配,我想在数组
b
中计算每对对象在同一集群中同时出现的频率。在Matlab中,我将编写如下内容:

b(a==5,a==5) = b(a==5,a==5) + 1
产出将是:

 b =
      1     1     0     0     0     0     0     1     0
      1     1     0     0     0     0     0     1     0
      0     0     0     0     0     0     0     0     0
      0     0     0     0     0     0     0     0     0
      0     0     0     0     0     0     0     0     0
      0     0     0     0     0     0     0     0     0
      0     0     0     0     0     0     0     0     0
      1     1     0     0     0     0     0     1     0
      0     0     0     0     0     0     0     0     0
例如,
b(2,8)==1(使用从1开始的Matlab索引),因为
2
8
两个元素都在集群
5

NumPy的索引系统非常不同,我想知道如何在那里做同样的事情

更新:

In [1285]: %%timeit
      ...: d=1000
      ...: b=np.zeros((d,d))
      ...: a=arange(d)>(d/2)
      ...: at=a[:,None]
      ...: b[a&at]+=1
      ...: 
10 loops, best of 3: 32.5 ms per loop
使用
b[m&m.T]+=1
可以得到正确的结果。我还提出了以下方法:

c = np.nonzero(a == 5)[0]
b[c.T,c] +=1
是否有充分的理由使用其中一个而不是另一个?我使用具有成千上万行/列的大型阵列

像这样的

In [1149]: m=(a==5)

In [1150]: b[m+m.T]+=1

In [1151]: b
Out[1151]: 
array([[ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.]])
更新:

In [1285]: %%timeit
      ...: d=1000
      ...: b=np.zeros((d,d))
      ...: a=arange(d)>(d/2)
      ...: at=a[:,None]
      ...: b[a&at]+=1
      ...: 
10 loops, best of 3: 32.5 ms per loop
根据您的评论,我想您需要的是
&

In [1220]: b[m&m.T]+=1

In [1221]: b
Out[1221]: 
array([[ 1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
基准测试:

In [1285]: %%timeit
      ...: d=1000
      ...: b=np.zeros((d,d))
      ...: a=arange(d)>(d/2)
      ...: at=a[:,None]
      ...: b[a&at]+=1
      ...: 
10 loops, best of 3: 32.5 ms per loop

你能给出一个输出示例吗?不幸的是,不能。输出数组在位置(0,2)处有值1,这是不正确的,因为这两个元素位于不同的簇中(分别为5和1)。干杯,我添加了示例输出,它目前给出了正确的结果。然而,它是否有效?如果我理解正确,您需要创建一个带有
good.shape[0]^2
元素的临时数组,这对于大型数组来说可能非常昂贵。@JohnManak是的,它使用numpy广播创建了一个tem 2D数组,但我不认为它太贵,请更新