Как я могу найти сумму вычитания в NumPy - PullRequest
2 голосов
/ 15 июня 2019

Я хотел бы использовать функцию numpy в ежедневном отчете, потому что мои данные довольно большие.

Давайте рассмотрим, у меня есть массив numy 2d

A = array([[0, 1, 2],
          [1, 2, 3],
          [2, 3, 4],
          [3, 4, 5],
          [4, 5, 6],
          [5, 6, 7],
          [6, 7, 8],
          [7, 8, 9]])

Я хочусделать что-то подобное

abs(array([0, 1, 2]) - array([[3, 4, 5], [4, 5, 6], ..., [7, 8, 9]])).sum()
abs(array([1, 2, 3]) - array([[4, 5, 6], [5, 6, 7], ..., [7, 8, 9]])).sum()
...
abs(array([3, 4, 5]) - array([[0, 1, 2], [6, 7, 8], [7, 8, 9]])).sum()
abs(array([4, 5, 6]) - array([[0, 1, 2], [1, 2, 3], [7, 8, 9]])).sum()
...
abs(array([7, 8, 9]) - array([[0, 1, 2], [1, 2, 3], ..., [4, 5, 6]])).sum()

Я пробовал это, но не могу пропустить массивы с любым из элементов на левой стороне, которые находятся в массиве на правой стороне.

for i in range(len(A)):
    temp = np.roll(A, -i, axis=0)
    print(abs(temp[0] - temp[3:]).sum())

Этоожидаемые результаты

results = [75, 54, ..., 30, 30, ...75]

Извините за плохое английское объяснение, спасибо.

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Если вы хотите иметь простое однострочное решение, включающее только функциональность NumPy, я предлагаю следующее:

import numpy as np

results = np.apply_along_axis(arr=A, 
                              axis=1, 
                              func1d=lambda x: 
                               np.abs(x - A[~np.isin(A, x).any(axis=1),:]).sum()
                              )

Результаты ожидаемые:

array([75, 54, 36, 30, 30, 36, 54, 75])
0 голосов
/ 15 июня 2019

Вот, пожалуйста:

= ^ .. ^ =

import numpy as np

A = np.array([[0, 1, 2],
          [1, 2, 3],
          [2, 3, 4],
          [3, 4, 5],
          [4, 5, 6],
          [5, 6, 7],
          [6, 7, 8],
          [7, 8, 9]])

def sum_data(select_row):
    # roll data
    rolled_data = np.roll(A, -select_row, axis=0)
    drop_numbers = []
    for item in rolled_data[0]:
        drop_numbers.append(item)

    # find rows to drop
    drop_rows = []
    for item in drop_numbers:
        # get rows
        gg = np.unique(np.where(rolled_data == item)[0])
        for number in gg:
            drop_rows.append(number)

    # get unique rows numbers
    unique_rows = list(set(drop_rows))
    del unique_rows[0]  # delete first number that is selected row

    # delete rows
    rolled_data = np.delete(rolled_data, unique_rows, axis=0)

    # calculate
    difference_value = 0
    for i in range(1, len(rolled_data), 1):
        difference_value += abs(rolled_data[0] - rolled_data[i]).sum()

    return difference_value

# loop over each row
collect_values = []
for j in range(len(A)):
    collect_values.append(sum_data(j))

Вывод:

[75, 54, 36, 30, 30, 36, 54, 75]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...