Размещение матриц 2×2 в ndarray без использования «для»

#python #numpy #numpy-ndarray

Вопрос:

Тупица

Во-первых, я определяю «x» и функцию «пример» ниже:

 import numpy as np
x=np.arange(1,4,1)
def example(d):
    return 2*d
 

В этом простом случае, если я поставлю «x» в «пример»,,

 y=example(x)
 

Я получаю» y», которое имеет ту же длину, что и x, и я могу быстро вычислить.

Однако, если я определю пример2, как показано ниже,

 def example2(d):
    matrix=np.array([[d,0],[0,d]])  ### last ] was missing
    return matrix
 

и введите «x» в пример2,

 y2=example2(x)
 

Что я получаю, так это

 [[array([1, 2, 3]) 0]
 [0 array([1, 2, 3])]]
<ipython-input-9-21f94eb7b4f4>:2: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray
  matrix=np.array([[d,0],[0,d]])
 

Также есть предупреждение.

Я действительно хочу создать ndarray(или список), который содержит матрицу в каждом термине без использования «для». Я могу сделать это, если использую «добавить», но для завершения вычислений требуется гораздо больше времени.

 A1=np.array([[1,0],[0,1]])
A2=np.array([[2,0],[0,2]])
A3=np.array([[3,0],[0,3]])
y3=np.array([A1,A2,A3])
 

Если я назову каждую матрицу A1,A2,A3, которые созданы в примере 2,
то я хочу создать y3, просто введя «x» в созданную мной функцию.

Есть ли какие-то решения?

Комментарии:

1. последний случай имеет форму (3,2,2). Середина пытается сделать (2,2) с (3,), встроенным в него 4 (как). Очень разные

2. Итак, вы имеете в виду, что нет никакого способа сделать (3,2,2), введя «x» в функцию? Я просто хочу сделать y3 без использования «для» ,что приводит к задержке в расчетах. Я знаю, что если я определю [ ](пустой список) и «добавлю» каждую матрицу с помощью «для», я могу сделать y3, но я не хочу этого делать.

3. Создание zeros((3,2,2)) и назначение arr[:,0,0]=x и т. Д

Ответ №1:

Вы можете инициализировать массив нужной формы и присвоить выбранные значения:

 In [93]: arr = np.zeros((3,2,2),int)
    ...: arr[:,0,0] = [1,2,3]
    ...: arr[:,1,1] = [4,5,6]
    ...: 
    ...: 
In [94]: arr
Out[94]: 
array([[[1, 0],
        [0, 4]],

       [[2, 0],
        [0, 5]],

       [[3, 0],
        [0, 6]]])
 

То же самое, но с одним назначением расширенной индексации:

 In [97]: arr = np.zeros((3,2,2),int)
    ...: arr[:,[0,1],[0,1]] = np.array([[1,2,3],[4,5,6]]).T 
In [98]: arr
Out[98]: 
array([[[1, 0],
        [0, 4]],

       [[2, 0],
        [0, 5]],

       [[3, 0],
        [0, 6]]])
 

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

Ответ №2:

не следуя, но:

 
import numpy as np


x=np.arange(1,4,1)
def example(d):
    return 2*d


y=example(x)

print(y)

def example2(d):
    matrix=np.array([[d,0],[0,d]], dtype= object)
    return matrix



y2=example2(x)

print('n___________________________')
print(y2)

 

дает:

 [2 4 6]

___________________________
[[array([1, 2, 3]) 0]
 [0 array([1, 2, 3])]]

 

так что никакой ошибки, не уверен, что это то, что вы искали, просто опубликуйте желаемый вывод, чтобы помочь другим, чтобы помочь вам