-1

Quelle est la manière la plus concise d'effectuer une telle multiplication?Un moyen rapide de multiplier un tableau NumPy de scalaires par un tableau de tableaux

# c's are scalars (or arrays like A's in general) 
x = np.array([c1, c2, c3]) 
# A's are NumPy arrays 
M = np.array([A1, A2, A3]) 

pour obtenir

x*M = [c1*A1, c2*A2, c3*A3] 

C sont scalaires, A sont des tableaux de MultiDim numériques numpy (disons, matrices).


code Exemple:

x = np.array([1,2,3]) 
A = np.random.rand(2,2) 
M = np.array([A,A,A]) 
+0

Quelle est la forme et de 'M' type de données? Est-ce que toutes les * sous-matrices * dans 'M' ont les mêmes formes? – Divakar

+0

Et 'dtype' de' M'? Est-ce un tableau 1d d'objets ou un tableau de nombres multidimensionnel? – hpaulj

+0

@hpaulj Supposons qu'il s'agisse de tableaux multidimensionnels de nombres - pour simplifier - les matrices 2D stockées sous le nom de 'np.array'. En quoi est-ce important? Scalar peut être multiplié par presque tout, n'est-ce pas? – homocomputeris

Répondre

0

produit = [x [i] * M [i] pour i dans la plage (len (x))]

+0

Ou comme ceci: '[A * c pour (A, c) dans zip (M, x)]'. Quoi qu'il en soit, je crois que les compréhensions sont plus lentes. – homocomputeris

2

Si M est une matrice numpy des types numériques primitifs, (ie pas d'objets), pour profiter de la diffusion numpy, vous pouvez ajouter des dimensions à x afin qu'il ait le même nombre de dimensions que M, puis la multiplication par élément devrait fonctionner:

x.reshape((-1,) + (1,)*(M.ndim - 1)) * M 

x = np.array([1,2,3]) 

cas 2D:

M = np.arange(12).reshape(3,4)  
x.reshape((-1,) + (1,)*(M.ndim - 1)) * M 
#array([[ 0, 1, 2, 3], 
#  [ 8, 10, 12, 14], 
#  [24, 27, 30, 33]]) 

cas 3D:

M = np.arange(12).reshape(3,2,2) 
x.reshape((-1,) + (1,)*(M.ndim - 1)) * M 
#array([[[ 0, 1], 
#  [ 2, 3]], 

#  [[ 8, 10], 
#  [12, 14]], 

#  [[24, 27], 
#  [30, 33]]]) 
+0

Merci, celui-ci fonctionne. Mais la lisibilité ... Il m'a fallu du temps pour comprendre ce qui se passe :) – homocomputeris