【问题标题】:Update array values for rows and columns given by a condition更新条件给定的行和列的数组值
【发布时间】:2014-02-28 14:17:25
【问题描述】:

我有以下两个数组:

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 索引)因为两个元素 28 都在簇 5 中。

NumPy 中的索引系统完全不同,我想知道如何在那里做同样的事情?

更新:

zhangxaochen's solution 使用 b[m&m.T]+=1 给出正确的结果。我也想出了以下方法:

c = np.nonzero(a == 5)[0]
b[c.T,c] +=1

是否有充分的理由使用其中一种?我使用具有数万行/列的大型数组。

【问题讨论】:

  • 你能给出一个示例输出吗?

标签: python arrays matlab numpy multidimensional-array


【解决方案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 [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 二维数组,但我不认为它太贵,更新了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多