Эффективный способ умножения каждого элемента массива numpy 1d и массива 3d - PullRequest
0 голосов
/ 15 января 2020

Я хочу умножить каждый элемент 1dArray и каждую матрицу 3dArray без for l oop.

arr1d2=np.array([1,2])
arr3d222=np.array([[[1,2],[3,4]],[[5,6],[7,8]]])

# Correct Solution is below
for i1 in range(len(arr1d2)):
    print(arr1d2[i1]*arr3d222[i1])

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

Попытка:

print(arr1d2[:]*arr3d222[:])

Спасибо за любую помощь.

Время Сравнение ответов

import time
import numpy as np
dim=250
arr1d=np.arange(dim)

arr3d,val_arr3=np.zeros([dim,dim,dim]),1
result=np.zeros(np.shape(arr3d))
for i1 in range(len(arr3d)):
  for i2 in range(len(arr3d[0])):
    for i3 in range(len(arr3d[0,0])):
        arr3d[i1,i2,i3]=val_arr3
        val_arr3=val_arr3+1

start_time1 = time.time()
# Correct Solution
for i1 in range(dim):
    result[i1]=arr1d[i1]*arr3d[i1]  
print("Method 1 : For Loop\n%s seconds." % (time.time() - start_time1))

result=np.zeros(np.shape(arr3d))
start_time2 = time.time()
result=arr1d.reshape(len(arr3d),1,1) * arr3d
print("Method 2 : arr1d.reshape(len(arr3d),1,1) * arr3d \n%s seconds." % (time.time() - start_time2))

result=np.zeros(np.shape(arr3d))
start_time3 = time.time()
result=arr1d[:, np.newaxis, np.newaxis] * arr3d
print("Method 3 : arr1d[:, np.newaxis, np.newaxis] * arr3d \n%s seconds." % (time.time() - start_time3))

Результат

Method 1 : For Loop
0.06770634651184082 seconds.
Method 2 : arr1d.reshape(len(arr3d),1,1) * arr3d 
0.05272269248962402 seconds.
Method 3 : arr1d[:, np.newaxis, np.newaxis] * arr3d 
0.048714399337768555 seconds.

Ответы [ 2 ]

3 голосов
/ 15 января 2020

Вы можете использовать np.newaxis, чтобы число измерений соответствовало:

arr1d2[:, np.newaxis, np.newaxis] * arr3d222
1 голос
/ 15 января 2020

Просто получите первый массив правильной формы:

arr1d2.reshape(len(arr3d222),1,1) * arr3d222
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...