访问数组中的数组元素

2024-05-17 18:14:12 发布

您现在位置:Python中文网/ 问答频道 /正文

示例:

matrix = np.zeros((2, 2), dtype=np.ndarray)
matrix[0, 0] = np.array([1, 2])
matrix[0, 1] = np.array([3, 4])
matrix[1, 0] = np.array([5, 6])
matrix[1, 1] = np.array([7, 8])

我想从每个数组的左项创建一个矩阵,即

[[1, 3], [5, 7]]

有没有速记法?我试过matrix[:,:][0]但这并不能得到我想要的。。。你知道吗

任何帮助都将不胜感激!你知道吗


Tags: 示例npzeros矩阵数组arraymatrixndarray
2条回答

您可以使用for-loop

import numpy as np

matrix = np.zeros((2, 2), dtype=np.ndarray)
matrix[0, 0] = np.array([1, 2])
matrix[0, 1] = np.array([3, 4])
matrix[1, 0] = np.array([5, 6])
matrix[1, 1] = np.array([7, 8])

array = [[matrix[i,j][0] for j in range(2)] for i in range(2)]

结果:[[1, 3], [5, 7]]

这里有几个选项,从最慢到最快。你知道吗

>>> import operator as op
>>> import itertools as it
>>>
>>> np.rec.fromrecords(matrix)['f0']
array([[1, 2],
       [5, 6]])
>>> timeit(lambda:np.rec.fromrecords(matrix)['f0'], number=100_000)
5.490952266845852
>>> 
>>> np.vectorize(op.itemgetter(0), otypes=(int,))(matrix)
array([[1, 3],
       [5, 7]])
>>> timeit(lambda:np.vectorize(op.itemgetter(0), otypes=(int,))(matrix), number=100_000)
1.1551978620700538
>>>
>>> np.stack(matrix.ravel())[:,0].reshape(matrix.shape)
array([[1, 3],
       [5, 7]])
>>> timeit(lambda: np.stack(matrix.ravel())[:,0].reshape(matrix.shape), number=100_000)
0.9197127181105316
>>> 
>>> np.reshape(next(zip(*matrix.reshape(-1))), matrix.shape)
array([[1, 3],
       [5, 7]])
>>> timeit(lambda:np.reshape(next(zip(*matrix.reshape(-1))), matrix.shape), number=100_000)
0.7601758309174329
>>>
>>> np.fromiter(it.chain.from_iterable(matrix.reshape(-1)), int)[::2].reshape(matrix.shape)
array([[1, 3],
       [5, 7]])
>>> timeit(lambda:np.fromiter(it.chain.from_iterable(matrix.reshape(-1)), int)[::2].reshape(matrix.shape), number=100_000)
0.5561180629301816
>>> 
>>> np.frompyfunc(op.itemgetter(0), 1, 1)(matrix).astype(int)array([[1, 3],
       [5, 7]])
>>> timeit(lambda:np.frompyfunc(op.itemgetter(0), 1, 1)(matrix).astype(int), number=100_000)
0.2731688329949975
>>> 
>>> np.array(matrix.tolist())[...,0]
array([[1, 3],
       [5, 7]])
>>> timeit(lambda:np.array(matrix.tolist())[...,0], number=100_000)
0.249452771153301

对于其他问题大小或平台,您可能会得到不同的排名顺序。你知道吗

相关问题 更多 >