В массиве numpy (список кортежей) скорость обработки снижается из-за многократного расширения (). Я хочу сделать эту часть быстрее - PullRequest
0 голосов
/ 02 апреля 2020

Существует массив numpy, который может быть сформирован путем объединения массива кортежей в a для l oop, как "res" в этом коде. (Имена и содержимое переменных упрощены по сравнению с реальным кодом.)

Если вы посмотрите на это более внимательно, для длины arr_2 будет выполнено a для l oop, а массив extends () - . Получается, что скорость обработки становится чрезвычайно высокой, когда arr_2 становится длинным.

Разве нельзя было бы обрабатывать на высокой скорости, хорошо создавая массив?

# -*- coding: utf-8 -*-
import numpy as np

arr_1 = np.array([[0, 0, 1], [0, 0.5, -1], [-1, 0, -1], [0, -0.5, -1], [1, 0, -1]])
arr_2 = np.array([[0, 1, 2], [0, 1, 2]])

all_arr = []
for p in arr_2:
    all_arr = [
    (arr_1[0], p), (arr_1[1], p), (arr_1[2], p), 
    (arr_1[0], p), (arr_1[1], p), (arr_1[4], p),
    (arr_1[0], p), (arr_1[2], p), (arr_1[3], p), 
    (arr_1[0], p), (arr_1[3], p), (arr_1[4], p),
    (arr_1[1], p), (arr_1[2], p), (arr_1[4], p), 
    (arr_1[2], p), (arr_1[3], p), (arr_1[4], p)]
    all_arr.extend(all_arr)


vtype = [('type_a', np.float32, 3), ('type_b', np.float32, 3)]
res = np.array(all_arr, dtype=vtype)

print(res)

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Часто со структурированными массивами быстрее назначать по полю вместо подхода списка кортежей:

In [388]: idx = [0,1,2,0,1,4,0,2,3,0,3,4,1,2,4,2,3,4] 
In [400]: res1 = np.zeros(36, dtype=vtype)                                                     
In [401]: res1['type_a'][:18] = arr_1[idx]                                                     
In [402]: res1['type_a'][18:] = arr_1[idx]                                                     
In [403]: res1['type_b'][:18] = arr_2[0]                                                       
In [404]: res1['type_b'][18:] = arr_2[1]                                                       
In [405]: np.allclose(res['type_a'], res1['type_a'])                                           
Out[405]: True
In [406]: np.allclose(res['type_b'], res1['type_b'])                                           
Out[406]: True
0 голосов
/ 02 апреля 2020

Я не мог понять, почему вы использовали этот индекс для arr_1, поэтому я просто скопировал его

import numpy as np

arr_1 = np.array([[0, 0, 1], [0, 0.5, -1], [-1, 0, -1], [0, -0.5, -1], [1, 0, -1]])
arr_2 = np.array([[0, 1, 2], [0, 1, 2]])

weird_idx = np.array([0,1,2,0,1,4,0,2,3,0,3,4,1,2,4,2,3,4])
weird_arr1 = arr_1[weird_idx]

all_arr = [(wiered_arr1[i],arr_2[j]) for j in range(len(arr_2)) for i in range(len(wiered_arr1)) ]

vtype = [('type_a', np.float32, 3), ('type_b', np.float32, 3)]
res = np.array(all_arr, dtype=vtype)

, вы также можете повторить массивы

arr1_rep = np.tile(weird_arr1.T,2).T 
arr2_rep = np.repeat(arr_2,weird_arr1.shape[0],0)
res = np.empty(arr1_rep.shape[0],dtype=vtype)
res['type_a']=arr1_rep
res['type_b']=arr2_rep
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...