заполнить логическую матрицу [r, n] вектором [n,] - PullRequest
1 голос
/ 25 апреля 2019

У меня есть числовой вектор values (серия в кадре данных панд 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

И я построил логическую матрицу вида

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]])

Использование следующего кода, полученного из некоторого ответа на SO, который, к сожалению, больше не может быть найден.

n=len(df)
k=5
r= n-k+1
mat=np.tile([1]*k+[0]*r, r)[:-r].reshape(r,n)

mat будет иметь форму (r,n), а df['values'] будет иметь форму (n,).

Как правильно заполнить mat значениями df['values']?

Учитывая предыдущий пример, мой ожидаемый результат будет:

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]])

Есть предложения о том, как этого добиться? Я попытался с точечным продуктом (надеясь, что он будет вести себя как в Matlab и повторить мой вектор r раз, но не сработал.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Вы можете использовать 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.]]
1 голос
/ 25 апреля 2019

Вот один из способов

ary=np.array([[0,1,1],[1,0,1]])
s=df['values'].values
ary1=ary.ravel().copy().astype('float')
ary1[ary1==1]=np.tile(s,len(ary))[ary1==1]

ary1.reshape(len(ary),-1)

Out[446]: 
array([[ 0.,  1.,  2.],
       [nan,  0.,  2.]])

Ввод данных:

df

idx     values
0          NaN
1            1
2            2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...