“Эта программа, возможно, не установила правильно” сообщение в Windows 7 RC

Подход № 1

Этот подход основан на a solution на Implement Matlab's im2col 'sliding' in python , который был разработан для rearrange sliding blocks from a 2D array into columns. Таким образом, чтобы решить наш случай, эти скользящие блоки из field_array могут быть уложены в виде столбцов и сопоставлены с версией столбца match_array.

Вот формальное определение функции для перегруппировки / укладки -

def im2col(A,BLKSZ):   

    # Parameters
    M,N = A.shape
    col_extent = N - BLKSZ[1] + 1
    row_extent = M - BLKSZ[0] + 1

    # Get Starting block indices
    start_idx = np.arange(BLKSZ[0])[:,None]*N + np.arange(BLKSZ[1])

    # Get offsetted indices across the height and width of input array
    offset_idx = np.arange(row_extent)[:,None]*N + np.arange(col_extent)

    # Get all actual indices & index into input array for final output
    return np.take (A,start_idx.ravel()[:,None] + offset_idx.ravel())

Чтобы решить наш случай, вот реализация на основе im2col -

# Get sliding blocks of shape same as match_array from field_array into columns
# Then, compare them with a column vector version of match array.
col_match = im2col(field_array,match_array.shape) == match_array.ravel()[:,None]

# Shape of output array that has field_array compared against a sliding match_array
out_shape = np.asarray(field_array.shape) - np.asarray(match_array.shape) + 1

# Now, see if all elements in a column are ONES and reshape to out_shape. 
# Finally, find the position of TRUE indices
R,C = np.where(col_match.all(0).reshape(out_shape))

. Вывод для данного образца в вопросе будет -

In [151]: R,C
Out[151]: (array([6]), array([3]))

Подход # 2

Учитывая, что opencv уже имеет функцию сопоставления шаблонов, которая делает квадрат различий, вы можете использовать это и искать нулевые различия, которые будут вашими соответствующими позициями. Итак, если у вас есть доступ к cv2 (opencv module), реализация будет выглядеть примерно так:

import cv2
from cv2 import matchTemplate as cv2m

M = cv2m(field_array.astype('uint8'),match_array.astype('uint8'),cv2.TM_SQDIFF)
R,C = np.where(M==0)

дает нам -

In [204]: R,C
Out[204]: (array([6]), array([3]))

Бенчмаркинг

В этом разделе сравниваются времена выполнения для всех подходов, предложенных для решения вопроса.

Определения методов -

def seek_array(search_in, search_for, return_coords = False):
    si_x, si_y = search_in.shape
    sf_x, sf_y = search_for.shape
    for y in xrange(si_y-sf_y+1):
        for x in xrange(si_x-sf_x+1):
            if numpy.array_equal(search_for, search_in[x:x+sf_x, y:y+sf_y]):
                return (x,y) if return_coords else True
    return None if return_coords else False

def skimage_based(field_array,match_array):
    windows = view_as_windows(field_array, match_array.shape)
    return (windows == match_array).all(axis=(2,3)).nonzero()

def im2col_based(field_array,match_array):   
    col_match = im2col(field_array,match_array.shape)==match_array.ravel()[:,None]
    out_shape = np.asarray(field_array.shape) - np.asarray(match_array.shape) + 1  
    return np.where(col_match.all(0).reshape(out_shape))

def cv2_based(field_array,match_array):
    M = cv2m(field_array.astype('uint8'),match_array.astype('uint8'),cv2.TM_SQDIFF)
    return np.where(M==0)

Тесты времени выполнения -

Случай № 1 (Образец данные из вопроса):

In [11]: field_array
Out[11]: 
array([[ 24,  25,  26,  27,  28,  29,  30,  31,  23],
       [ 33,  34,  35,  36,  37,  38,  39,  40,  32],
       [-39, -38, -37, -36, -35, -34, -33, -32, -40],
       [-30, -29, -28, -27, -26, -25, -24, -23, -31],
       [-21, -20, -19, -18, -17, -16, -15, -14, -22],
       [-12, -11, -10,  -9,  -8,  -7,  -6,  -5, -13],
       [ -3,  -2,  -1,   0,   1,   2,   3,   4,  -4],
       [  6,   7,   8,   4,   5,   6,   7,  13,   5],
       [ 15,  16,  17,   8,   9,  10,  11,  22,  14]])

In [12]: match_array
Out[12]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

In [13]: %timeit seek_array(field_array, match_array, return_coords = False)
1000 loops, best of 3: 465 µs per loop

In [14]: %timeit skimage_based(field_array,match_array)
10000 loops, best of 3: 97.9 µs per loop

In [15]: %timeit im2col_based(field_array,match_array)
10000 loops, best of 3: 74.3 µs per loop

In [16]: %timeit cv2_based(field_array,match_array)
10000 loops, best of 3: 30 µs per loop

Случай №2 (большие случайные данные):

In [17]: field_array = np.random.randint(0,4,(256,256))

In [18]: match_array = field_array[100:116,100:116].copy()

In [19]: %timeit seek_array(field_array, match_array, return_coords = False)
1 loops, best of 3: 400 ms per loop

In [20]: %timeit skimage_based(field_array,match_array)
10 loops, best of 3: 54.3 ms per loop

In [21]: %timeit im2col_based(field_array,match_array)
10 loops, best of 3: 125 ms per loop

In [22]: %timeit cv2_based(field_array,match_array)
100 loops, best of 3: 4.08 ms per loop

29
задан 1 July 2009 в 13:25
поделиться

2 ответа

Ну, чтобы ответить на мой собственный вопрос, я нашел способ решить эту проблему. Я заметил, что журнал изменений WinRAR указывает, что самораспаковщик WinRAR также страдал от той же самой проблемы, и что она была решена. Поэтому я скачал последнюю версию WinRAR и бросил ее в дизассемблер вместе с более ранней версией, ища любые новые вызовы API и т. Д. Короче говоря, оказывается, что все, что он сделал, это добавил следующее в манифест:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
  <application>
    <!--The ID below indicates application support for Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
    <!--The ID below indicates application support for Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
  </application>
</compatibility>

Некоторое прибегание к поиску строк вызвало некоторую документацию: очевидно, это что-то новое, что было добавлено в Windows 7, и что документация для него была создана 20 мая. Это не помогло, что Microsoft не ссылается на это ни на одной из своих страниц документации по Win7, тем более, что это заметно. вздох

Редактировать: Это плохо документировано на MSDN здесь .

29
ответ дан Josh Kelley 14 October 2019 в 08:55
поделиться

Вы бросили Application Compatibility Toolkit в свой установщик?

У меня никогда не было причин иметь дело с ним раньше, но, похоже, это именно то, для чего он предназначен.

]
1
ответ дан Kevin Montrose 14 October 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: