簡體   English   中英

python 2D列表,原始2D列表中周圍單元格的平均值

[英]python 2D list with average of surrounding cells in original 2D list

我需要編寫一個函數blur(l),用其鄰居及其自身的平均值替換2D矩陣(即矩形的2D列表)中的每個單元。 每個像元最多具有8個鄰居,因此,平均值最多要計算9個像元。 對於給定的列表,您可能唯一想到的是它是矩形的,並且只包含整數。

這必須在沒有numpy的情況下完成!

我嘗試使用此代碼:

def blur(l):
    result = []
    for x in range(len(l) - 1):
        tussen = []
        for y in range(len(l) - 1):
            t = get_neighbor_sum(l, x, y)
            tussen.append(t)
        result.append(tussen)
    return result

def get_value(list, i, j):
    new_i = len(list) - 1
    new_j = len(list[new_i]) - 1
    print(i, j, new_i, new_j)
    return list[new_i][new_j]


def get_neighbor_sum(list, i, j):
    sum = 0
    for offset_i in [-1, 0, 1]:
        for offset_j in [-1, 0, 1]:
            sum += get_value(list, i + offset_i, j + offset_j)
    return sum

但由於某種原因,它僅返回原始列表,有人可以向我解釋原因以及如何解決此問題嗎?

import itertools

def get_neighbors(lst, point):
    x,y = point
    neighbors = []
    for offset_x, offset_y in itertools.product([-1, 0, 1], repeat=2):
        new_x, new_y = x + offset_x, y + offset_y
        try:
            neighbors.append(lst[new_y][new_x])
        except IndexError:
            continue
    return neighbors

這應該給你的相鄰小區的所有值lst相對於點point (這應該是形式的元組(column, row) )。 從那里,您應該能夠遍歷列表,並將該元素替換為sum(result)/len(result)

for y, row in enumerate(lst):
    for x, _ in enumerate(row):
        result = get_neighbors(lst, (x, y))
        lst[y][x] = sum(result) / len(result)

您甚至可以通過更改get_neighbors函數以接受一個參數來搜索更多偏移量,以及每個偏移量的權重,從而使結果模糊一些。

import itertools

def get_neighbors(lst, point, n=1, weights=None):
    if weights is None:
        weights = dict()
    x, y = point
    neighbors = []
    offsets = range(-n, n+1)
    for offset_x, offset_y in itertools.product(offsets, repeat=2)):
        new_x, new_y = x + offset_x, y + offset_y
        weight = weights.get(new_y, {}).get(new_x, 1)
        # defaults to 1.
        # Same as try: weights[new_y][new_x] except KeyError: 1
        try:
            neighbors.append(lst[new_y][new_x] * weight)
        except IndexError:
            continue
    return neighbors

這期望權重是指決定應該為偏移量x和y賦予多少權重的命令的命令,例如:

{-1: {-1: 0.5,
       0: 1,
       1: 0.5},
  1: {-1: 0.5,
       0: 1,
       1: 0.5}}

假定所有丟失的鍵都具有完全權重,因此這將使下面標記為X的方塊的權重為一半

X O X
O O O
X O X

可能會有更好的實現,但我想不到一個副手:)

應該使用get_value()檢查為函數提供索引的列表是否有效。 如果它們的索引無效,則get_neighbor_sum()不應將它們相加。在角落,平均值只能在四個值之間。 這很難用兩個函數來完成,因為我們必須為無效的get_value()返回一個值(可能是浮點數),讓get_neighbor_sum()注意這一點,而不是添加它。

我認為您根本不需要函數get_value(),並且可以通過創建get_neighbor_average函數使其變得更容易:

def get_neighbor_average(list, i, j):
    sum = 0
    div = 0
    for offset_i in [-1, 0, 1]:
        for offset_j in [-1, 0, 1]:
            new_i = i + offset_i
            new_j = j + offset_j
            if (new_i >= 0 and new_j >= 0 and new_i < len(list) and new_j < len(list)):
                sum += list[new_i][new_j]
                div += 1
    avg = sum / div
    return avg

這為您提供了所有鄰居的平均值,但是很安全,因為它會檢查我們嘗試訪問的list元素是否有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM