Использование: оператора для индексации numpy.ndarray для numpy.void (как вывод numy.genfromtxt)
Я генерирую данные, используя numpy.genfromtxt
как это:
ConvertToDate = lambda s:datetime.strptime(s,"%d/%m/%Y")
data= numpy.genfromtxt(open("PSECSkew.csv", "rb"),
delimiter=',',
dtype=[('CalibrationDate', datetime),('Expiry', datetime), ('B0', float), ('B1', float), ('B2', float), ('ATMAdjustment', float)],
converters={0: ConvertToDate, 1: ConvertToDate})
Теперь я хочу извлечь последние 4 столбца (из каждой строки, но в цикле, поэтому давайте просто рассмотрим одну строку) для разделения переменных. Итак, я делаю это:
B0 = data[0][2]
B1 = data[0][3]
B2 = data[0][4]
ATM = data[0][5]
Но если я могу сделать это (как я мог бы, например, с обычным 2D ndarray), я бы предпочел это:
B0, B1, B2, ATM = data[0][2:]
Но это дает мне ошибку "неверный индекс". Есть ли способ сделать это красиво или я должен придерживаться подхода 4 линии?
1 ответ
Как результат np.genfromtxt
, у вас есть структурированный массив, то есть одномерный массив, в котором каждая строка представлена в виде разных полей.
Если вы хотите получить доступ к некоторым полям, просто доступ к ним по именам:
data["B0"], data["B1"], ...
Вы также можете сгруппировать их:
data[["B0", "B1]]
который дает вам "новый" структурированный массив только с теми полями, которые вы хотели (кавычки вокруг "новые", потому что данные не копируются, они все равно совпадают с вашим исходным массивом).
Если вам нужны определенные "строки", просто выполните:
data[["B0","B1"]][0]
который выводит первый ряд. Нарезка и модная индексация тоже работают.
Итак, для вашего примера:
B0, B1, B2, ATM = data[["B0","B1","B2","ATMAdjustment"]][0]
Если вы хотите получить доступ только к этим полям строка за строкой, я бы предложил сначала сохранить весь массив полей, которые вы хотите, а затем выполнить итерацию:
filtered_data = data[["B0","B1","B2","ATMAdjustment"]]
for row in filtered_data:
(B0, B1, B2, ATM) = row
do_something
или даже:
for (B0, B1, B2, ATM) in filtered_data:
do_something