Я пытаюсь получить все строки с индексом 0 из одного массива в другой с помощью цикла for и np.concatenate - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь получить все строки с индексом 0 из одного массива в другой с циклом for и np.concatenate

i=0
data0 = np.zeros((1,257))
data0.shape = (257,)
for j in range (0,7291):
    if datatrain[j,i] == 0:
       data0 = np.concatenate((data0, datatrain[j,:]))

Моя проблема заключается в том, что после обновления каждого цикла data0Есть ли лучшие подходы для этого?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Вам вообще не нужен цикл:

col = 0
indices = np.where(datatrain[:, col] == 0)[0]
zero_col = np.zeros_like(indices).reshape(-1, 1)
data_of_interest = np.concatenate((zero_col, datatrain[indices, :]), axis=1)

Поскольку у меня нет образца вашего набора данных, я не могу проверить его для вашей конкретной ситуации.

0 голосов
/ 22 октября 2018

Вы хотите просто получить все строки с 0 в них?Вы можете сделать это следующим образом:

import numpy as np
datatrain = np.arange(25).reshape(5, 5)
datatrain[0][1] # 1st row has two 0s (arange starts at 0)
datatrain[1][2] = 0 # 2nd row now has a 0
datatrain[-1][4] = 0 # last row now has a 0
print(datatrain)
# Outputs:
# [[ 0  0  2  3  4]
# [ 5  6  0  8  9]
# [10 11 12 13 14]
# [15 16 17 18 19]
# [20 21 22 23  0]]

rows_inds_with_zeros, cols_with_zeros = np.where(datatrain == 0)
print(rows_inds_with_zeros)
# Ouputs: [0 0 1 4] (as expected, note 0th row included twice)

# You probably don't want the row twice if it has two 0s,
# although that's what your code does, hence np.unique
rows_with_zeros = datatrain[np.unique(rows_inds_with_zeros)]
print(rows_with_zeros) # Or call it data0, whatever you like
# Outputs:
# [[ 0  0  2  3  4]
# [ 5  6  0  8  9]
# [20 21 22 23  0]]

HTH.

...