Использование списка для выбора одной и той же позиции в нескольких массивах в Python - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть 53 двумерных массива numpy эквивалентного размера. Мой первый массив имеет значения нолей и единиц (с несколькими неважными -1 (значения NaN). Я пытаюсь использовать значения первого массива для выбора значений в оставшихся, чтобы сделать отдельный кортеж / одномерный массив / вектор он содержит 52 элемента по порядку. Я хотел бы сделать случайные 100 из этих векторов, которые сохраняют отношения наборов данных в первом массиве. Поэтому я должен иметь возможность поместить их в отдельные наборы данных, которые можно перетасовать перед выбором.

Для достижения этой цели я решил, что важно создать список элементов в первом массиве и их расположение. Код для подражания.

np.unique(index, return_counts = True)

# -1, 25. 0, 1210816. 1 , 1210816
###

wpx = 1916546
nwpx = 1210816
tpx = wpx + nwpx
wpxp = wpx/tpx * 100 #61%
nwpxp = nwpx/tpx * 100 #39%
#tpx
#wpxp
#nwpxp

###
#create a list of all values and their locations
#write values into txt/csv for portability to other projects using same data
indexdict = {}
i=0
j=0
indexfile = open('/location1/location2/file1.txt','w')
for ivalue in index:
#    while j < 5:
    while j < len(ivalue):
        #indexdict[(i,j)]=ivalue[j]
        indexfile.write("%i,%i,%i\n"%(i,j,ivalue[j]))
        j+=1
    j=0
    i+=1
#print(indexdict)
indexfile.close()

Это создает текстовый файл (CSV), который содержит данные, которые выглядят следующим образом (X, Y, Значение)

643,1613,1
643,1614,1
643,1615,1
643,1616,1
643,1617,0
643,1618,0
643,1619,0

Затем я разделяю значения на то, что можно перемешать.

###
#Read text in and sort values into separate "buckets"
indexfile = open('/location1/location2/file1.txt','r')
zerointerest=[]
TargetA=[]
TargetB=[]
for line in indexfile:
    line=line.rstrip()
    iline=line.split(',')
    #print(iline[2])
    if iline[2] == "-1":
        zerointerest.append((iline[0],iline[1]))
    elif iline[2] == "0":
        TargetA.append((iline[0],iline[1]))
    elif iline[2] == "1":
        TargetB.append((iline[0],iline[1]))  
indexfile.close()
#print(zerointerest)
#print(TargetA)
#print(TargetB)

Это то место, где я застреваю. Я создал список значений и местоположений, но я не знаю, как поступить. Я не могу понять, как использовать список, который я создал, чтобы выбрать значения в том же месте в массивах 1- 52, прежде чем добавлять значение массива 53 в его конец, т.е. IE:

[25,26,27,28,29,33,35,37,40,45,50,55,60,75,80,90,100,110,105,100,95,90,85,80,100,120,140,150,150,150,150,150,150,150,150,150,150,145,140,135,130,125,120,115,110,100,100,100,100,100,100,1]

1 Ответ

0 голосов
/ 04 сентября 2018

вот код для вдохновения:

import numpy as np

a_list_of_2D_arrays = [ np.arange(9).reshape(3, 3) for _ in range(5) ]

# Create a uniaue 3D array by concatenating the arrays:
a_3D_array = np.dstack(a_list_of_2D_arrays)

print(a_3D_array.shape)  # (3, 3, 5)

mask = np.array([[0, 0, 1],   # your first array?
                 [-1, 0, 1],
                 [1, 0, -1]])

mask.nonzero() # a tuple of indexes:
# gives (array([0, 1, 1, 2, 2]), array([2, 0, 2, 0, 2]))

(mask == 1).nonzero()  # consider only the 1 values
# gives (array([0, 1, 2]), array([2, 2, 0]))

a_3D_array[mask.nonzero()]  # extract the values along the third dim
                            # at the given indexes

последняя строка дает:

array([[2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3],
       [5, 5, 5, 5, 5],
       [6, 6, 6, 6, 6],
       [8, 8, 8, 8, 8]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...