Python: Как отредактировать массив 2d, введя список координат? [Дубликат]

Нет, не разбит, но большинство десятичных дробей должно быть аппроксимировано

Резюме

Арифметика с плавающей точкой точный, к сожалению, он не очень хорошо сочетается с нашим обычным представлением числа base-10, так что получается, что мы часто даем ему ввод, который немного от того, что мы написали.

Даже простые числа, такие как 0.01, 0.02, 0.03, 0.04 ... 0.24, не представляются точно как двоичные дроби, даже если в мантиссе были тысячи бит точности, даже если у вас были миллионы. Если вы отсчитываете с шагом 0,01, пока вы не достигнете 0,25, вы получите первую фракцию (в этой последовательности), представленную в base10 и base2. Но если вы попытались использовать FP, ваш 0,01 был бы слегка отключен, поэтому единственный способ добавить 25 из них до хорошего точного 0.25 потребовал бы длинной цепи причинности, включающей защитные биты и округление.

Мы постоянно даем аппарату FP что-то вроде простого в базе 10, но это повторяющаяся фракция в базе 2.

Как это произошло?

Когда мы пишем в десятичной форме, каждая дробь является рациональным числом форма

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; x / (2n + 5n).

В двоичном выражении мы получаем только член 2n , то есть:

& nbsp ; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; x / 2n

Итак, в десятичной форме мы не можем представлять 1/3. Поскольку база 10 включает в себя 2 как простой коэффициент, каждое число, которое мы можем записать как двоичную дробь , также может быть записано в виде базовой дроби. Однако вряд ли что-либо, что мы пишем как base10, представляется в двоичном виде. В диапазоне от 0,01, 0,02, 0,03 ... 0,99 только цифры три могут быть представлены в нашем формате FP: 0,25, 0,50 и 0,75, поскольку они равны 1/4, 1/2, и 3/4 - все числа с простым множителем, использующим только 2n-член.

В базе 10 мы не можем представлять 1/3. Но в двоичном коде мы не можем делать 1/10 или 1/3.

Так что, хотя каждая двоичная дробь может быть записана в десятичной системе, обратное неверно. И фактически большинство десятичных дробей повторяются в двоичном формате.

Работа с ним

Разработчикам обычно дают указание & Lt; epsilon , лучшим советом может быть округление до целочисленных значений (в библиотеке C: round () и roundf (), т. е. оставаться в формате FP), а затем сравнивать. Округление до определенной длины десятичной дроби решает большинство проблем с выходом.

Кроме того, при реальных проблемах с хрустом (проблемы, которые FP был изобретен на ранних, ужасно дорогих компьютерах) физические константы Вселенной и все другие измерения известны только относительно небольшому числу значимых цифр, поэтому все пространство проблем было «неточным» в любом случае. FP «точность» не является проблемой в этом виде приложений.

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

Мне нравится ответ на пиццу от Chris , потому что он описывает фактическую проблему, а не только обычная ручная работа о «неточности». Если бы FP были просто «неточными», мы могли бы исправить , что и сделали бы это несколько десятилетий назад. Причина, по которой у нас нет, - это то, что формат FP компактен и быстр, и это лучший способ хрустить множество чисел. Кроме того, это наследие космической эры и гонки вооружений и ранние попытки решить большие проблемы с очень медленными компьютерами с использованием небольших систем памяти. (Иногда отдельные магнитные сердечники для 1-битного хранилища, но это другая история. )

Заключение

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

3
задан user2285236 2 May 2016 в 18:43
поделиться

3 ответа

zip(*...) - удобный способ «переноса» списка списков (или кортежей). И A[x,y] совпадает с A[(x,y)].

In [397]: lst = [(0,1), (0, 2), (1, 0), (1, 3), (2,1)]

In [398]: tuple(zip(*lst))    # make a tuple of tuples (or lists)
Out[398]: ((0, 0, 1, 1, 2), (1, 2, 0, 3, 1))

In [399]: A=np.zeros((3,4),dtype=bool)  # make an array of False

In [400]: A[tuple(zip(*lst))] = True  # assign True to the 5 values

In [401]: A
Out[401]: 
array([[False,  True,  True, False],
       [ True, False, False,  True],
       [False,  True, False, False]], dtype=bool)
3
ответ дан hpaulj 31 August 2018 в 23:09
поделиться

Вы можете использовать многомерную индексацию для этого:

>>> lst = np.array(lst)
>>> arr = np.repeat(False, 12).reshape(3, 4)
>>> arr[lst[:,0], lst[:,1]] = True
>>> arr
array([[False,  True,  True, False],
       [ True, False, False,  True],
       [False,  True, False, False]], dtype=bool)
2
ответ дан Ashwini Chaudhary 31 August 2018 в 23:09
поделиться

Ниже приведен подход, использующий NumPy's linear indexing , который работает для кортежей любых длин, предназначенных для генерации многомерных массивов -

# Convert list of indices to a 2D array version
idx = np.array(lst)

# Decide on the shape of output array based on the extents, then initialize
shp = idx.max(0)+1
out = np.zeros(shp,dtype=bool)

# Using np.put insert 1s in out at places specified by linear indices version
np.put(out,np.ravel_multi_index(idx.T,shp),1)

Вход для образца, выход -

In [54]: lst
Out[54]: [(0, 1, 3), (0, 2, 2), (1, 0, 0), (1, 3, 1), (2, 1, 3)]

In [55]: out
Out[55]: 
array([[[False, False, False, False],
        [False, False, False,  True],
        [False, False,  True, False],
        [False, False, False, False]],

       [[ True, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False,  True, False, False]],

       [[False, False, False, False],
        [False, False, False,  True],
        [False, False, False, False],
        [False, False, False, False]]], dtype=bool)
1
ответ дан Divakar 31 August 2018 в 23:09
поделиться
Другие вопросы по тегам:

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