Как рассчитать два разных значения массива numpy, а затем поместить результат в третий массив - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть два массива, которые нужно вычислить, чтобы получить необходимое поведение для третьего массива.

Для начала вот первые два массива:

[[2 0 1 3 0 1]
 [1 2 1 2 1 2]       # ARRAY 1
 [2 1 2 1 0 1]
 [0 2 0 2 2 3]
 [0 3 3 3 1 4]
 [2 3 2 3 1 3]]

[[0.60961197 0.29067687 0.20701799 0.79897639 0.74822711 0.21928105]
[0.67683562 0.14261662 0.74655501 0.21529103 0.14347939 0.42190162]
[0.21116134 0.98618323 0.93882545 0.51422862 0.12715579 0.18808092]    # ARRAY 2
[0.48570863 0.32068082 0.32335023 0.62634641 0.37418013 0.44860968]
[0.12498966 0.56458377 0.24902924 0.12992352 0.76903935 0.68230202]
[0.90349626 0.75727838 0.14188677 0.63082553 0.96360265 0.28694261]]

Где массив1[0] [0] будет использоваться для вычитания входного значения из массива3 [0] [0], а затем будет использоваться массив2 [0] [0], умножив теперь вычтенное значение из массива3 [0] [0] надать новый вывод массива3 [1] [0] (другими словами, эти вычисления получат массив3).

Так, например, допустим, что начальные значения массива3 [0]:

[[20,22,24,40,42,10],
  ....

Для массива 3 [0] [0] (20) необходимо вычесть 2 (исходя из массива 1 [0] [0]), оставив значение с 18. Затем значение 18 умножается на СЕЙЧАС на 0,60961197 (массив 2 [0] [0]), оставляя НОВОЕ ЗНАЧЕНИЕ 10,97 . 10,97 теперь является новым значением массива3 [1] [0].

Если бы вы перешли к следующему столбцу, процесс был бы таким же.Вы бы взяли 22-0 = 22, а затем 22 * ​​0,29067687, чтобы создать новое значение для массива3 [1] [1].

Чтобы предоставить наглядный пример, завершенный процесс этого массива для первых двухстроки будут выглядеть примерно так:

      [[20 22 24 40 42 10],
     [10.97  19.65 7.44 10.58 7.03],
      ....

Я пытаюсь продолжить этот процесс для всей длины первого массива (и я полагаю, второй, потому что они одинаковы).Таким образом, для следующего набора вы бы взяли 10,97-1 * 0,6768 ... = 6,74 .. и так далее для каждого индекса, пока он не достигнет конца.

Я застрял на том, что для этого нужно сделать, я пробовал цикл for, но я чувствую, что может быть гораздо более эффективный способ сделать это в numpy.

Я искренне ценю помощь , я знаю, что это нелегко (или, может быть, будет!).Это положит начало тому, что будет довольно длительным проектом для меня.

Большое спасибо!

Примечание: Если массивные массивы не являются хорошим способом решения этой проблемы и, скажем, списки лучше, я более чем готовидти по этому пути.Я просто предполагаю, что с большинством функций numpy это будет проще.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Просто расширяю мой комментарий до полного ответа.Речь идет о двух видах "повторения":

  • Параллельно выполнимые (по столбцам, с возможностью вещания)
  • Параллельно не выполнимые(построчно, итеративно)

numpy прекрасно обрабатывает трансляцию (то есть направление столбца), поэтому просто используйте цикл for в направлении строки:

for i in range(len(array1)):
    array3[i+1] = (array3[i] - array1[i]) * array2[i]

Обратите внимание array3 должно быть длиннее array1 или array2, в противном случае это не имеет смысла.

РЕДАКТИРОВАТЬ

К сожалению, я не видел, что вы хотите избежатьдля цикла.Технически вы можете решить эту проблему без цикла for, но вам нужно самим возиться с линейной алгеброй:

Если мы назовем array1 как a, array2 как b, а первоеряд array3 как c для удобства.Строки array3 будут:

  • c
  • (c-a0)*b0 = c*b0-a0*b0
  • ((c-a0)*b0-a1)*b1 = c*b0*b1-a0*b0*b1-a1*b1
  • ...

Последняя строка array3 может быть затем вычислена как

B = b[::-1].cumprod(0)[::-1]
final_c = c * B[0] - (B * a).sum(0)

Если вы хотите получить целое array3, это не совсем тривиально без цикла for.Вы могли бы написать это, но это и больно читать, и больно писать.Производительность тоже под вопросом

0 голосов
/ 06 декабря 2018

Если я правильно понял, вы могли бы сделать что-то вроде этого:

import numpy as np

np.random.seed(42)

arr1 = np.array([[2, 0, 1, 3, 0, 1],
                 [1, 2, 1, 2, 1, 2],
                 [2, 1, 2, 1, 0, 1],
                 [0, 2, 0, 2, 2, 3],
                 [0, 3, 3, 3, 1, 4],
                 [2, 3, 2, 3, 1, 3]])

arr2 = np.array([[0.60961197, 0.29067687, 0.20701799, 0.79897639, 0.74822711, 0.21928105],
                 [0.67683562, 0.14261662, 0.74655501, 0.21529103, 0.14347939, 0.42190162],
                 [0.21116134, 0.98618323, 0.93882545, 0.51422862, 0.12715579, 0.18808092],
                 [0.48570863, 0.32068082, 0.32335023, 0.62634641, 0.37418013, 0.44860968],
                 [0.12498966, 0.56458377, 0.24902924, 0.12992352, 0.76903935, 0.68230202],
                 [0.90349626, 0.75727838, 0.14188677, 0.63082553, 0.96360265, 0.28694261]])

arr3 = np.random.randint(5, 30, size=(6, 6))

result = (arr3 - arr1) * arr2

print(result)

Вывод

[[ 5.48650773  6.97624488  3.72632382  9.58771668  8.97872532  5.2627452 ]
 [ 6.7683562   2.99494902 19.41043026  2.79878339  2.00871146 10.96944212]
 [ 4.85671082  6.90328261  9.3882545  13.88417274  0.89009053  4.702023  ]
 [12.14271575  1.28272328  9.05380644  8.76884974  2.99344104  1.34582904]
 [ 3.1247415   1.12916754  3.23738012  2.98824096 11.53559025 17.0575505 ]
 [17.16642894  8.33006218  2.55396186 10.09320848 17.3448477   5.7388522 ]]

Если применить к данным из вашего примера, вы получите:

arr3 = np.array([20, 22, 24, 40, 42, 10])
result = (arr3 - arr1[0]) * arr2[0]
print(result)

Вывод

[10.97301546  6.39489114  4.76141377 29.56212643 31.42553862  1.97352945]

Обратите внимание, что во втором примере я просто использую первый ряд из arr2 и arr3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...