Использование: оператора для индексации 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
Другие вопросы по тегам