массив из genfromtxt передается как последовательность?

#python #arrays #numpy #matplotlib #errorbar

#python #массивы #numpy #matplotlib #панель ошибок

Вопрос:

У меня есть список координат и их соответствующие значения ошибок в форме:

 # Graph from standard correlation, page 1
1.197   0.1838  -0.03504    0.07802  -0.006464   0.004201
1.290   0.2072  -0.04241    0.05380  -0.005833   0.008101
  

где столбцы обозначают x,y,lefterror,righterror,buttomerror,toperror , что я загружаю файл как error=np.genfromtxt("standard correlation.1",skip_header=1) и, наконец, я пытаюсь отобразить это как

 xerr=error[:,2:4]
yerr=error[:,4:]
x=error[:,0]
y=error[:,1]
plt.errorbar(x,y,xerr=xerr,yerr=yerr,fmt='')
  

Который кричит ValueError: setting an array element with a sequence. , когда я пытаюсь его запустить, я понимаю, что эта ошибка возникает, когда вы передаете объект, такой как список, в аргумент, который ожидает объект numpy array, я не знаю, как мне решить эту проблему, поскольку np.genfromtxt всегда должен возвращать ndarray .

Спасибо за вашу помощь.

Редактировать: я изменил файл, чтобы удалить символ ‘ ‘, так как чтение ‘ -‘ привело бы к значениям NaN в нижнем столбце ошибок, но я все равно получаю ту же ошибку.

Комментарии:

1. С принтами error . Также покажите нам его shape и dtype . При использовании genfromtxt рекомендуется посмотреть, что он создает, прежде чем пытаться его использовать.

2. используя print np.shape(x),np.shape(y),np.shape(xerr),np.shape(yerr), type(datos) I get (30,) (30,) (30, 2) (30, 2) <type 'numpy.ndarray'> также, ошибка находится в строке из plt.errorbar(), которую я указал выше

Ответ №1:

Благодаря hpaulj я заметил, что форма полос ошибок была (30,2), однако plt.errobar() ожидается, что ошибки будут в форме (2, n), поскольку python обычно транспонирует матрицы в аналогичных операциях и автоматически избегает этой проблемы. Я подумал, что это тоже сделает, но я решил изменить строки следующим образом:

 xerr=error[:,2:4]
yerr=error[:,4:]
  

в

 xerr=np.transpose(error[:,2:4])
yerr=np.transpose(error[:,4:])
  

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

Ответ №2:

Форма массива, который numpy ожидает для отдельных строк ошибок, такова (2, N) . Поэтому вам также необходимо транспонировать свой массив error[:,2:4].T , matplotlib.errorbar понимая эти значения относительно данных. Если x это значение и (xmin, xmax) соответствующая ошибка, строка ошибок переходит от x-xmin к x xmax . Поэтому у вас не должно быть отрицательных значений в массивах errorbar.

 import numpy as np
import matplotlib.pyplot as plt

f = "1   0.1  0.05    0.1 0.005  0.01"   
   " 1.197   0.1838  -0.03504    0.07802 -0.006464  0.004201 "   
   " 1.290   0.2072  -0.04241    0.05380 -0.005833  0.008101" 
error=np.fromstring(f, sep=" ").reshape(3,6)
print error
#[[ 1.        0.1       0.05      0.1       0.005     0.01    ]
# [ 1.197     0.1838   -0.03504   0.07802  -0.006464  0.004201]
# [ 1.29      0.2072   -0.04241   0.0538   -0.005833  0.008101]]

xerr=np.abs(error[:,2:4].T)
yerr=np.abs(error[:,4:].T)
x=error[:,0]
y=error[:,1]
plt.errorbar(x,y,xerr=xerr,yerr=yerr,fmt='')
plt.show()
  

Что касается ошибки значения, возможно, она была вызвана - проблемой.