Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 30, 2011 20:38:54

Just_for_fun
От:
Зарегистрирован: 2011-11-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание массива

Доброе время суток.
Имеется программа

  import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt("filepath")

A = data[:,2]/data[:,1]
C= B*A
файл представляет из себя три столбца
с н-ным количеством строк
например
0. 1. 2.3
0. 2. 3.1
0. 3. 4.5
1. 1. 0.2
1. 2. 6.1
1. 3. 7.8
т.е. у всех числе тип float
можно ли превратить данный неупорядоченный массив в такой
2.3 3.1 4.5
0.2 6.1 7.8
и как?
мои идеи иссякли на этом
for i in data[:,0]:
while data[:,0][i] == data[:,0][i-1]:
for j in data[:,1]:
A[i,j] = data[:,2][j]
что-то не очень вышло.
просто в дальнейшем планировал работать с таким массивом и получать граф. изображение его, напр. типа contour и т.п.



Офлайн

#2 Ноя. 30, 2011 20:53:59

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Создание массива

matplotlib работает с numpy массивами для них транспонирование
a.T



Офлайн

#3 Ноя. 30, 2011 21:33:22

Just_for_fun
От:
Зарегистрирован: 2011-11-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание массива

Хм, либо я Вас не понял либо Вы меня.
У меня программа считывает файл, в котором три столбца. И производит нехитрую операцию деления одного столбца на другой.
В итоге у меня три линейных массива. Но так вышло, что первый и второй столбцы файла data и data - это индексы строк и столбцов квадратной матрицы соотв. Значениями является третий линейный массив.
Вся суть вопроса - как собрать матрицу, или 2D массив из того что есть.



Офлайн

#4 Дек. 1, 2011 01:34:00

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Создание массива

Если Вы не уверены в порядке строк в файле то можно так:
(я специально изменил порядок строк)

DATA = """
1. 1. 0.2
0. 2. 3.1
0. 1. 2.3
1. 3. 7.8
1. 2. 6.1
0. 3. 4.5
""".strip()

def parse_slow(data):
data = data.split("\n")
result = [[.0 for j in range(3)] for i in range(len(data) // 3)]

for row, col, value in (l.split() for l in data):
result[int(row[:-1])][int(col[:-1]) - 1] = float(value)

return result
если же порядок строк будет соответствовать приведенному Вами, то можно немного быстрее:
DATA = """
0. 1. 2.3
0. 2. 3.1
0. 3. 4.5
1. 1. 0.2
1. 2. 6.1
1. 3. 7.8
""".strip()

def parse_fast(data):
data = [float(value) for _, _, value in (l.split() for l in data.split("\n"))]
return [data[i:i+3] for i in range(0, len(data), 3)]



Офлайн

#5 Дек. 1, 2011 20:08:00

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Создание массива

Это я не понял сразу
почемубы вам не воспользоваться scipy.sparce
там есть матрица в координатном формате - ей кормите свои массивы а потом делаете из нее заполненную.
или просто

import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt("fil.dat")

ny=np.max(data[:,0])+1
nx=np.max(data[:,1])+1
A=np.zeros((ny,nx))
for i,j,v in data:
A[i,j]=v
Извините если опять неправильно понял



Отредактировано (Дек. 1, 2011 20:23:46)

Офлайн

#6 Дек. 1, 2011 21:50:43

Just_for_fun
От:
Зарегистрирован: 2011-11-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание массива

doza_and, спасибо большое!
Вот это именно то что мне нужно. Благодарю также за наводку на scipy.sparce, я почему-то думал что это исключительно для различных алгебраических задач и проч. Как я понял, это вот эта матрица scipy.sparse.coo_matrix

pyuser, спасибо за помощь и отзывчивость!
К сожалению в силу своей малой грамотности и по некоторым причинам, лучшего понимания императивного стиля, в ваших функциях мне сложно разобраться.
Но это уже лично моя необразованность.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version