2012-06-18 2 views
4

Я хотел бы изменить данные, хранящиеся в 1D в 2D: Я имею в виду:1D в 2D массив - питон

из

x|y|a 
1|1|a(1,1) 
2|1|a(2,1) 
3|1|a(3,1) 
1|2|a(1,2) 
... 

в:

x\y|1  |2  |3 
1 |a(1,1)|a(1,2)|a(1,3 
2 |a(2,1)|a(2,2)|a(2,3)... 
3 |a(3,1)|a(3,2)|a(3,3)... 
    ... 

Я сделал это от 2 петель:

(rows - array of x,y,a) 
for n in range(len(rows)): 
      for k in range(x_len): 
        for l in range(y_len): 
          if ((a[2, n] == x[0, k]) and (a[3, n] == y[0, l])): 
            c[k, l] = a[0, n] 

, но это занимает много времени, поэтому мой вопрос заключается в том, что для Python существует разумное и быстрое решение .

Так уточнить, что я хочу сделать:

Я знаю функцию возврата(), дело в том, что это случайно в массиве .

Итак:

a = np.empty([4, len(rows)] 

Я прочитал данные в массив из базы данных, которая имеет 4 столбцов (1,2, х, у) и «LEN (строк) 'ряды.

Меня интересует столбец «1» - этот, который я хочу поместить в новый модифицированный массив.

x = np.zeros([1, x_len], float) 

y = np.zeros([1, y_len], float) 

х представляет собой вектор отсортированного колонка (х) из массива , но без duplicitas с длиной x_len

(я прочитал его запрос sql: выберите отдельный ...)

у представляет собой вектор отсортированного колонка (у) из массива (без duplicitas) с длиной y_len

Затем я делающий массив:

c = np.zeros([x_len, y_len], float) 

и помещено 3 петлями (извините за ошибку до) данные с rray в: >

for n in range(len(rows)): 
    for k in range(x_len): 
     for l in range(y_len): 
      if ((a[2, n] == x[0, k]) and (a[3, n] == y[0, l])): 
       c[k, l] = a[0, n] 

Пример:

массив а

array([[1, 3, 6, 5, 6], 
      [1, 2, 5, 5, 6], 
      [1, 4, 7, 1, 2], ## x 
      [2, 5, 3, 3, 4]]) ## y 

векторов: х и у

[[1,2,4,7]] ## x with x_len=4 

[[2,3,4,5]] ## y with y_len=4 

Массив с

array([[1, 5, 0, 0], 
      [0, 0, 0, 0], 
      [0, 0, 0, 3], 
      [0, 6, 0, 0]]) 

последний массив с выглядит следующим образом (первый а [0] записывается в):

x\y 2|3|4|5 
----------- 
1 1|5|0|0 
2 0|0|0|0 
4 0|0|0|3 
7 0|6|0|0 

Я надеюсь, что я не сделал ошибку, как это написано в массив с.

Большое спасибо за любую помощь.

+1

Я знаю, что вы, вероятно, потратили много времени форматирования вашего вопроса, но все
сделать это трудно, чтобы помочь с форматированием. – Levon

+0

избавился от
и сделал его проще. В следующий раз используйте теги «code», чтобы было легче увидеть ваш код :) – hammythepig

+1

Здесь три петли, а не два. И каково значение 'len (rows)'? Кажется, вы зацикливаете значения 'x' и' y', проверяя каждую пару против одной строки 'a'. Существует почти наверняка лучший способ сделать это, но я не могу сказать, что такое 'x',' y' и 'a'; ваша индексация заставляет его выглядеть так, как если бы они были более сложными структурами данных. Дайте нам простой пример - скажем, пример из 9 строк, написанный в правильном синтаксисе Python, чтобы мы могли просто скопировать и вставить код. Затем вы получите сетку 3x3. – senderle

ответ

6

Вы можете использовать numpy:

>>> import numpy as np 
>>> a = np.arange(9) 
>>> a 
array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 
>>> a.reshape(3,3) 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 
#or: 
>>> a.reshape(3,3).transpose() 
array([[0, 3, 6], 
     [1, 4, 7], 
     [2, 5, 8]]) 
+0

Выполняет ли функция reshape() порядок данных в массиве? Потому что он случайный в моем массиве a. И я не могу полностью понять, что reshape() решает мою проблему ... – Purchawka

Смежные вопросы