Как я могу превратить данные X, Y, Z, Value в массив в python? - PullRequest
0 голосов
/ 06 августа 2020

Я хочу взять x, y, z, данные значения, где x, y, z - позиции, а значение - это число в очень длинном списке и преобразовать его в массив, в котором каждая позиция в массиве представлена ​​x, y, z, а число является значением. Например:

1,1,1,27
2,2,2,38

будет означать, что array[1,1,1] = 27 и array[2,2,2] = 38.

Как я могу сделать это эффективно, пожалуйста?

Данные поступают из CSV напильник, длина 2000. Прост в обращении. В индикаторах будет некоторое совпадение, но нам нужно усреднить строку значений для каждого - например, 1.3,1,1,27 и 1.2,1,1,28 должны стать массивом [1,1,1] = 27,5

Ответы [ 3 ]

1 голос
/ 06 августа 2020

, поскольку вы не можете использовать число как массив (или список), вместо этого вам нужно использовать словарь. попробуйте это:

listData        = '1,1,1,27// 2,2,2,38'
partition       = list(map(str.split,listData.split("//")))
lastDict        = {}
for i,it in enumerate(partition):
    xyzV        = it[0].split(',')
    lastDict[xyzV[-1]] = (xyzV[0] , xyzV[1] , xyzV[2])
print(lastDict)

outPut будет выглядеть так:

{'27': ('1', '1', '1'), '38': ('2', '2', '2')}

Надеюсь, это было полезно

UPDATE

когда вы меняете разделитель данных с «//» на новую строку, вы можете использовать вместо «//» в разделении, используйте «\ n»

0 голосов
/ 06 августа 2020

Думаю, это решает проблему для всех заинтересованных

countArray = np.zeros((int(np.max(xpos)+2),int(np.max(ypos)+2),int(np.max(zpos)+2)))
totalArray = np.zeros((int(np.max(xpos)+2),int(np.max(ypos)+2),int(np.max(zpos)+2)))

for n in range(totalLines):
 
    if n==lines: print(maxx,maxy,maxz,n,n/lines)
    nx = int(round(xpos[n]))
    ny = int(round(ypos[n]))
    nz = int(round(zpos[n]))

    countArray[nx,ny,nz] += counts[n]
    totalArray[nx,ny,nz] += 1
    if nx > maxx: maxx = nx
    if ny > maxy: maxy = ny
    if nz > maxz: maxz = nz
    
    
    maxx += 1
    maxy += 1 
maxz += 1                

for x in range(totalArray.shape[0]):
    for y in range(totalArray.shape[1]):
        for z in range(totalArray.shape[2]):
            if(totalArray[x,y,z]==0):
                totalArray[x,y,z]=1
                   
scanDataArray = np.divide(countArray[0:maxx,0:maxy,0:maxz],totalArray[0:maxx,0:maxy,0:maxz])
0 голосов
/ 06 августа 2020

Вы можете использовать трехмерный массив. Если данные поступают из файла CSV, может сработать что-то вроде ниже. Как отметил @Tomerikoo, вам сначала нужно будет инициализировать трехмерный массив:

import csv 


sizeX = 0
sizeY = 0
sizeZ = 0
rawData = []

with open('file.csv', newline='') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')

    for line in reader:
        x, y, z, val = list(map(int, line.split(',')))
        rawData.append((x,y,z,val))
        sizeX = max(sizeX, x)
        sizeY = max(sizeY, Y)
        sizeZ = max(sizeZ, Z)

mat = [[[None]*sizeX for _ in range(0, sizeY)] for __ in range(0, sizeZ)]

for data in rawData:
    # average out the old value if old value exists
    if mat[data[0]][data[1]][data[2]] is not None:
        mat[data[0]][data[1]][data[2]] = (mat[data[0]][data[1]][data[2]] + data[3])/2
    else:
        mat[data[0]][data[1]][data[2]] = data[3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...