有没有办法在邻居检查时优化后续迭代:
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数组,A
和v
是元组(例如(0,1,0,0))。
答案 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