python - fill logical matrix [r,n] with a vector [n,]
问题描述
I have a numeric vector values
(a series in a pandas dataframe df
).
idx values
0 NaN
1 1
2 2
3 NaN
4 NaN
5 33
6 34
7 90
8 NaN
9 5
10 NaN
11 22
12 70
13 NaN
14 672
15 10
16 73
17 9
18 NaN
19 15
And I constructed a logical matrix of the form
array([[1, 1, 1, ..., 0, 0, 0],
[0, 1, 1, ..., 0, 0, 0],
[0, 0, 1, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 1, 0, 0],
[0, 0, 0, ..., 1, 1, 0],
[0, 0, 0, ..., 1, 1, 1]])
Using the following code fetched from some answer on SO, which unfortunately can't find anymore.
n=len(df)
k=5
r= n-k+1
mat=np.tile([1]*k+[0]*r, r)[:-r].reshape(r,n)
mat
will have shape (r,n)
and df['values']
will have shape (n,)
.
What is the proper way to fill mat
with the values in df['values']
?
Given the previous example, my expected output would be:
array([[NaN, 1, 2, NaN, ..., 0, 0, 0],
[ 0, 1, 2,NaN,NaN, ..., 0, 0, 0],
[ 0, 0, 2,NaN,NaN,33, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 672, 10, 73, 9, 0, 0],
[0, 0, 0, ..., 10,73, 9, NaN, 0],
[0, 0, 0, ..., 73, 9, NaN, 15]])
Any suggestion on how to achieve this?
I tried with a dot product (hoping that it would behave as in matlab and replicate my vector r
times but didn't work.
解决方案
您可以使用numpy.apply_along_axis
和numpy.where
:
#!/usr/bin/env python3
import numpy as np
import pandas as pd
nan = np.nan
df = pd.DataFrame([
nan, 1, 2, nan, nan, 33, 34, 90,
nan, 5, nan, 22, 70, nan, 672,
10, 73, 9, nan, 15],
columns=['values'])
n = len(df)
k = 5
r = n - k + 1
mat = np.tile([1] * k + [0] * r, r)[:-r].reshape(r, n)
mat = np.apply_along_axis(lambda row: np.where(row, df['values'], row), 1, mat)
print(mat)
输出:
[[ nan 1. 2. nan nan 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 1. 2. nan nan 33. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 2. nan nan 33. 34. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. nan nan 33. 34. 90. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. nan 33. 34. 90. nan 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 33. 34. 90. nan 5. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 34. 90. nan 5. nan 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 90. nan 5. nan 22. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. nan 5. nan 22. 70. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 5. nan 22. 70. nan 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. nan 22. 70. nan 672. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 22. 70. nan 672. 10. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 70. nan 672. 10. 73. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. nan 672. 10. 73. 9. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 672. 10. 73. 9. nan 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 10. 73. 9. nan 15.]]
推荐阅读
- azure - Azure 应用服务中的多层应用的身份验证问题
- reactjs - this.state.projects.map 不是一个函数 - React
- javascript - 删除带有索引js jquery的对象数组
- azure - 在 VSCODE 活动栏上丢失了我的 Azure 图标
- html - MIME 类型不匹配
- java - 动态创建队列并将其绑定到单个 Exchange
- .net-core - Fluent NhiberNate .net core 3.1 with sql server
- linux - 每个线程的套接字描述符
- proxy - 如何像代理一样转发 GRPC?
- laravel - 因为我的测试需要很长时间才能运行?phpunit 和 laravel