Функция numpy.insert () вставляет массив в неверный индекс - PullRequest
0 голосов
/ 15 февраля 2019

Здесь мой код имеет значение текстового файла;и создавать матрицы как многомерный массив, но проблема в том, что код создает более двухмерного массива, которым я не могу манипулировать, мне нужен двумерный массив, как мне это сделать?

Объясните алгоритм моего кода:

Мото кода: Мой код извлекает значение из определенной папки, каждая папка содержит 7 файлов 'txt', которые генерируются одним пользователем, таким образом, несколько папок содержат несколько данных нескольких пользователей.

step1: Запустите 1-й цикл for и управляйте им, используя количество папок в определенной папке, а в переменной 'path' сохраните первый путь первой папки.

step2: Откройте путь и получите данныеиз 7 текстовых файлов, используя 2nd для loop.after feats, он закрывает 2nd для loop и выполняет остальной код.

step3: Объединяет данные 7 текстового файла в один 1d массив.

step4: создать 2d массив, используя получение данных из 2-х папок

step5 (здесь возникает проблема): создать строку в 2d массиве и вставить массив идентификаторов

import numpy as np
import array as arr
import os
f_path='Result'
array_control_var=0

#for feacth directory path
for (path,dirs,file) in os.walk(f_path):
    if(path==f_path):
        continue
    f_path_1= path +'\page_1.txt'
    #Get data from page1 indivisualy beacuse there string type data exiest
    pgno_1 = np.array(np.loadtxt(f_path_1, dtype='U', delimiter=','))

    #only for page_2.txt
    f_path_2= path +'\page_2.txt'
    with open(f_path_2) as f:
        str_arr = ','.join([l.strip() for l in f])
    pgno_2 = np.asarray(str_arr.split(','), dtype=int)

    #using loop feach data from those text file.datda type = int
    for j in range(3,8):
    #store file path using variable
        txt_file_path=path+'\page_'+str(j)+'.txt'


        if os.path.exists(txt_file_path)==True:

            #genarate a variable name that auto incriment with for loop
            foo='pgno_'+str(j)
        else:
            break

        #pass the variable name as string and store value
        exec(foo + " = np.array(np.loadtxt(txt_file_path, dtype='i', delimiter=','))")

    #marge all array from page 2 to rest in single array in one dimensation
    f_array=np.concatenate((pgno_2,pgno_3,pgno_4,pgno_5,pgno_6,pgno_7), axis=0)

    #for first time of the loop assing this value
    if array_control_var==0:
        main_f_array=f_array
    if array_control_var==1:

        #here use np.array()
        main_f_array=np.array([main_f_array,f_array])
    else:
        main_f_array=np.insert(main_f_array, array_control_var, f_array, 0)

    array_control_var+=1

print(main_f_array)

Я хочу вывод, подобный этому

Начальные [[0,0,0], [0,0,0,]]

после вставки [[0,0,0], [0,0,0], [0,0,0]]

но выход составляет

[array([0,  0,  0])
array([0,  0,  0])
0 0 0]

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Когда я рекомендую заменить insert на построение списка, вот что я имею в виду.

import numpy as np

alist = []
for i in range(4): 
    f_array = np.array([i, i+2, i+4])
    alist.append(f_array)

print(alist)
main_f_array = np.array(alist)

print(main_f_array)

тестовый прогон:

1246:~/mypy$ python3 stack54715610.py 
[array([0, 2, 4]), array([1, 3, 5]), array([2, 4, 6]), array([3, 5, 7])]
[[0 2 4]
 [1 3 5]
 [2 4 6]
 [3 5 7]]

Если при загрузке вашего файла появляются массивы разного размера, вы получите разные результаты

f_array = np.arange(i, i+1+i)

1246:~/mypy$ python3 stack54715610.py 
[array([0]), array([1, 2]), array([2, 3, 4]), array([3, 4, 5, 6])]
[array([0]) array([1, 2]) array([2, 3, 4]) array([3, 4, 5, 6])]

Это 1dмассив dtype объекта, в отличие от 2d.

0 голосов
/ 15 февраля 2019

Как я прокомментировал, собирать массивы с insert (или вариациями на concatenate) трудно правильно и медленно при работе.Каждый раз он создает новый массив.Сбор массивов в списке и создание одного массива в конце проще и быстрее.Добавление в список является эффективным и простым в использовании.

Тем не менее, ваш отчетный результат выглядит подозрительно.Я могу воспроизвести его с помощью:

In [281]: arr = np.zeros(2, object)
In [282]: arr
Out[282]: array([0, 0], dtype=object)
In [283]: arr[0] = np.array([0,0,0])
In [284]: arr[1] = np.array([0,0,0])
In [285]: arr
Out[285]: array([array([0, 0, 0]), array([0, 0, 0])], dtype=object)
In [286]: np.insert(arr, 2, np.array([0,0,0]), 0)
Out[286]: array([array([0, 0, 0]), array([0, 0, 0]), 0, 0, 0], dtype=object)

На более ранней итерации main_f_array должен был быть создан как массив dtype объекта.

Если бы это был «нормальный» 2d массив,вставка будет другой:

In [287]: arr1 = np.zeros((2,3),int)
In [288]: np.insert(arr1, 2, np.array([0,0,0]), 0)
Out[288]: 
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

Или более итеративно, как я думаю, вы хотели:

In [289]: f_array = np.array([0,0,0])
In [290]: main = f_array
In [291]: main = np.array([main, f_array])
In [292]: main
Out[292]: 
array([[0, 0, 0],
       [0, 0, 0]])
In [293]: main = np.insert(main, 2, f_array, 0)
In [294]: main
Out[294]: 
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])
...