通过numpy数组优化迭代,以便进行邻居检查

时间:2018-02-10 01:38:16

标签: python arrays numpy optimization

有没有办法在邻居检查时优化后续迭代:

CREATE OR REPLACE TRIGGER INSERTINTOOrderProcessTable
AFTER INSERT ON OrderRelationTable
FOR EACH ROW DECLEAR
         v_order_type := null;
BEGIN
         SELECT OrderType INTO v_order_type FROM OrderTable
         WHERE OrderId = :new.OrderId
         AND OrderType IS NOT NULL
         AND rownum=1;

      IF v_order_type IS NOT NULL THEN
         INSERT INTO OrderProcessTable VALUES (:new.OrderId, v_order_type, :new.CustId, 'N');
      END IF;
END;

其中for i in range(1, A.shape[0]): for j in range(1, A.shape[1]): v = (A[i, j], A[i-1,j-1], A[i-1, j], A[i, j-1]) if v == something: print(v) 是一个(非常大的)0和1的numpy数组,Av是元组(例如(0,1,0,0))。

3 个答案:

答案 0 :(得分:2)

首先创建测试数据:

import numpy as np
np.random.seed(1)
A = np.random.randint(0, 2, size=(10, 8)).astype(np.uint8)

A:

array([[1, 1, 0, 0, 1, 1, 1, 1],
       [1, 0, 0, 1, 0, 1, 1, 0],
       [0, 1, 0, 0, 0, 1, 0, 0],
       [1, 0, 0, 0, 1, 0, 0, 0],
       [1, 1, 1, 1, 1, 0, 0, 0],
       [1, 1, 1, 1, 1, 1, 0, 1],
       [1, 0, 0, 1, 0, 0, 1, 1],
       [1, 0, 1, 0, 0, 1, 1, 0],
       [1, 1, 1, 1, 0, 0, 1, 1],
       [0, 0, 0, 0, 1, 1, 1, 0]], dtype=uint8)

然后创建一个使用位来表示邻居值的数组:

a = A[:-1, :-1] << 3
a |= A[:-1, 1:] << 2
a |= A[1:, :-1] << 1
a |= A[1:, 1:]

检查

的邻居值
11
00

你可以使用:

a == int("1100", 2)

输出:

array([[False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False],
       [False,  True, False, False,  True, False, False],
       [False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False],
       [ True,  True,  True, False, False, False, False]], dtype=bool)

答案 1 :(得分:1)

您需要做的就是生成四个布尔条件数组。大致是:

mode="side"

然后你可以找到所有四个都是真的地方:

spot = A == v[0]
upleft = np.roll(A, (1,1), (0,1)) == v[1]
left = np.roll(A, 1, 1) == v[2]
up = np.roll(A, 1, 0) == v[3]

这将为您提供一个布尔数组,只要满足所有条件,该数组就为True。您应该忽略第一行和第一行,因为它们无法计算:

res = spot & upleft & left & up

答案 2 :(得分:1)

以下是@ Matt.St在评论中提出的基于卷积的方法。

DECIMAL