【问题标题】:Quickly fill large Numpy matrix from Pandas DataFrame从 Pandas DataFrame 快速填充大型 Numpy 矩阵
【发布时间】:2018-05-05 21:24:09
【问题描述】:

我有 DataFrame df,其中包含 x 轴、y 轴和填充 numpy 矩阵 mat 的值的信息。

较小的df 示例:

y   x   x   x   x   value   value   value   value
1   6   3   6   4   100     10      300     15
1   6   2   8   7   50      200     35      70
5   7   5   4   6   2       50      40      400
7   5   3   2   1   105     80      35      44

我想用每个y 填充mat = np.zeros(shape=(10,10)) 是行索引,x 是列索引,其值与值块中的x 位于同一位置。比如

col=1, row=6, value=100 ###
col=1, row=3, value=10
col=1, row=6, value=300 ###
col=1, row=4, value=10
col=1, row=6, value=50  ###

如果有多个值进入该位置(例如###),请进行平均。有什么方法可以直接从 Pandas 到矩阵(或其他快捷方式)?

我现在可以做的是首先使用数据框中选定列的np.ravel 来制作一维数组并从这些数组中填充,但它很慢而且很多冗余。

【问题讨论】:

  • x 的列数是否固定且已知?
  • @R.S.NikhilKrishna 是的

标签: python python-2.7 pandas numpy


【解决方案1】:

构造行和列索引并执行切片分配。

val = df.values
j = val[:, 0].repeat(4)
i = val[:, 1: 5].ravel()
v = val[:, 5:].ravel()
mat = np.zeros(shape=(10,10), dtype=int)

mat[i, j] = v

mat

array([[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,  44,   0,   0],
       [  0, 200,   0,   0,   0,   0,   0,  35,   0,   0],
       [  0,  10,   0,   0,   0,   0,   0,  80,   0,   0],
       [  0,  15,   0,   0,   0,  40,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,  50,   0, 105,   0,   0],
       [  0,  50,   0,   0,   0, 400,   0,   0,   0,   0],
       [  0,  70,   0,   0,   0,   2,   0,   0,   0,   0],
       [  0,  35,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0]])

平均值

val = df.values
j = val[:, 0].repeat(4)
i = val[:, 1: 5].ravel()
v = val[:, 5:].ravel()

sums = np.bincount(i * 10 + j, v, 100)
cnts = np.bincount(i * 10 + j, minlength=100)
mask = cnts > 0

sums[mask] /= cnts[mask]

print(sums.reshape(10, 10))

[[   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]
 [   0.    0.    0.    0.    0.    0.    0.   44.    0.    0.]
 [   0.  200.    0.    0.    0.    0.    0.   35.    0.    0.]
 [   0.   10.    0.    0.    0.    0.    0.   80.    0.    0.]
 [   0.   15.    0.    0.    0.   40.    0.    0.    0.    0.]
 [   0.    0.    0.    0.    0.   50.    0.  105.    0.    0.]
 [   0.  150.    0.    0.    0.  400.    0.    0.    0.    0.]
 [   0.   70.    0.    0.    0.    2.    0.    0.    0.    0.]
 [   0.   35.    0.    0.    0.    0.    0.    0.    0.    0.]
 [   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]]

【讨论】:

  • 对平均有什么建议吗?
  • 你介意在这里解释一下np.bincount吗?我现在阅读了文档,但不太了解发生了什么。
  • np.bincount 将计算遇到每个索引(或 bin)的次数。真正的诀窍是我如何使用i * 10 + j 将行和列索引转换为扁平数组的索引......然后使用np.bincount。好的,这就解释了计数。其次,我执行另一个np.bincount,但这次是weights。这使用我作为@​​987654329@ 传递的数组来求和而不是计数。这充当每个箱内的总和。当我将两者分开时,我得到一个平均值。我必须使用mask 来确保我没有被零除。
  • 几乎明白了。抱歉花了一点时间。如果我的矩阵是m*n,是否应该将i * 10 更改为i * mi * n?还是10 来自别的东西?
猜你喜欢
  • 2018-01-23
  • 2017-02-22
  • 1970-01-01
  • 2018-05-31
  • 2020-09-27
  • 2018-09-20
  • 1970-01-01
  • 2016-10-07
  • 2015-04-01
相关资源
最近更新 更多