Helpers - компьютеры, интернет, программирование

Как реструктурировать 2D-массив 2D-массивов numpy в 4D-массив поплавков?

В настоящее время у меня есть проблема, когда у меня есть массив формы (60,60), где каждая точка сама по себе является массивом формы (11,11). Это вызывает у меня проблемы, потому что каждая точка массива (60,60) является объектом, а не числом с плавающей запятой:

    P_arr.shape
    (60,60)
    P_arr[i,j].shape
    (11,11)
    P_arr[i,j][k,l]
    1.0

Для матричных операций, которые мне нужно выполнить позже, мне нужно получить доступ к каждому значению с плавающей запятой массива в определенном порядке. Мне нужно, чтобы новый массив имел форму (11,11,60,60), где каждая точка была бы числом с плавающей запятой. В идеале я хотел бы достичь этой точки:

    New_P_arr[k,l,i,j]
    1.0

Есть ли способ извлечь значения с плавающей запятой из внутренних 2D-массивов, чтобы преобразовать их в желаемую форму? Мне нужно решение, которое быстрее, чем зацикливание, потому что в будущем оно значительно расширится. Я пробовал сглаживание, vstack, конкатенацию и т. д. Проблема с сглаживанием, например, заключается в следующем:

    New_P_arr = np.concatenate(P_arr)
    New_P_arr.shape
    (3600,)
    New_P_arr[i].shape
    (11,11)

Таким образом, выравнивание массива (или другие операции) не позволит мне получить доступ ко всем значениям в пределах одного индекса квадратных скобок. Моя первоначальная мысль состояла в том, чтобы сгладить массив, чтобы изменить его форму, но поскольку точки являются объектами, а не числами с плавающей запятой, это тоже не сработает.

РЕДАКТИРОВАТЬ: Вот как я сгенерировал P_arr. Мне нужно решить связанную функцию Лежандра для выбора значений 11 l и 11 m по сетке тета-значений формы (60,60). В Scipy есть пакет lpmn, который вычисляет связанные полиномы Лежандра, а также их производные (которые мне не нужны), но он не векторизован. Он возвращает массив (11,11) с заданным тета-значением для каждого l и m до значения, которое я ввожу (от 0 до 10, откуда берется 11). Это код:

    import numpy as np
    from scipy.special import lpmn
    lmax = 10
    mmax = lmax
    theta = np.arange(0, 180., 3)
    theta = theta*np.pi/180.
    phi = theta
    ph, th = np.meshgrid(theta, phi)
    cos_th = np.cos(th)
    th is a (60,60) array of theta values from 0-pi in equal steps    

    @np.vectorize
    def asscP(m, l, cos_theta):
        return lpmn(m, l, cos_theta)[0]

    asscP = np.vectorize(asscP, excluded={0,1}, otypes=[np.ndarray])
    P_arr = asscP(mmax, lmax, cos_th)
28.08.2019

  • можете ли вы опубликовать код, как вы создали P_arr? 28.08.2019
  • Отредактировал пост. Я надеюсь, что это достаточное количество информации. 28.08.2019
  • Можете ли вы также минимизировать проблему? Как насчет массива 2x2, содержащего массивы 2x2? Воспроизводит ли это вашу проблему: import numpy as np; a = np.array([[1,2],[3,4]], dtype='object'); a[0,0] = np.array([[1,2],[3,4]]); a[0,1] = np.array([[5,6],[7,8]]); a[1,0] = np.array([[9,10],[11,12]]); a[1,1] = np.array([[13,14],[15,16]]); 28.08.2019
  • arr = np.array([lpmn(mmax, lmax, np.cos(t))[0] for t in theta]) создает массив (60,11,11). Это соответствует np.stack(P_arr[:,i]) для любого i. Все столбцы вашего P_arr одинаковы (потому что это верно и для th). vectorize делает больше работы, чем вам нужно (и зачем двойная векторизация?). 29.08.2019

Ответы:


1
  • вы можете сначала сложить внутренний уровень, а затем внешний уровень.
>>>new_P_arr = np.stack([np.stack(p) for x in P_arr])
>>>new_P_arr.shape
(60,60,11,11)
28.08.2019

2

Поскольку вас беспокоит производительность, вам, вероятно, следует пересмотреть свой код генерации данных. Два момента, которые следует учитывать:

  1. Согласно документам, np.vectorize не ускоряет ваш код, это просто удобная функция, которая будет перебирать ваши элементы.
  2. Ваш массив cos_th имеет те же значения, поэтому дорогостоящий вызов lpmn выполняется в 60 раз чаще, чем необходимо.

Исходя из этого, я предлагаю вам использовать циклы python и назначения фрагментов numpy следующим образом:

import numpy as np
from scipy.special import lpmn
lmax = 10
mmax = lmax
theta = np.arange(0, 180., 3)
theta = theta*np.pi/180.
cos_theta = np.cos(theta)
P_arr = np.zeros(shape=(len(theta), len(theta), mmax+1, lmax+1))
for e, ct in enumerate(cos_theta):
    P_arr[0,e,:] = lpmn(mmax, lmax, ct)[0]
    for i in range(1, len(theta)):
        P_arr[i,e,:] = P_arr[e,0,:] # copy data 60x
P_arr = P_arr.swapaxes(0,2)
P_arr = P_arr.swapaxes(1,3)
P_arr.shape
28.08.2019
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

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

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..