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数组,但我不认为它太贵,请更新