У меня есть следующий массив словарей 2x2:
a = np.array([[{'x_id':0, 'y_id':0},{'x_id':1, 'y_id':1}],[{'x_id':2, 'y_id':0},{'x_id':3, 'y_id':1}]])
Я хотел бы получить массив чисел 2x2, соответствующих значениям ключа 'x_id'
, [[0, 1], [2, 3]]
, то есть:
0 1
2 3
Есть ли способ, кроме двойного цикла? То есть:
numbers = [[a[i,j]['x_id'] for j in range(2)] for i in range(2)]
Если вы говорите о цикле явный for в коде, вы можете flatten
свой массив и выполнить работу, используя один цикл for, за которым следует изменение формы вашего окончательного массива.
numbers = np.array([i['x_id'] for i in a.flatten()]).reshape(a.shape)
# array([[0, 1],
# [2, 3]])
Альтернативным решением будет использование itemgetter
в сглаженном массиве как
import operator
numbers = np.array(list(map(operator.itemgetter('x_id'), a.flatten()))).reshape(a.shape)
Представление: оба метода занимают одинаковое время.
%timeit np.array([i['x_id'] for i in a.flatten()]).reshape(a.shape)
# 4.16 µs ± 676 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.array(list(map(operator.itemgetter('x_id'), a.flatten()))).reshape(a.shape)
# 4.9 µs ± 1.26 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Список (списков) словарей был бы так же хорош