Это часть алгоритма для генерации концентрических c колец точек на гексагональной решетке, которые я переписываю.
Я думал, что это целочисленная математика, но я обнаружил, что что в некоторых случаях массивы неожиданно создаются как float!
В приведенной ниже последовательности p0
- это float64
для n=1
, но int64
для n>1
, и я просто не могу понять, почему это происходит.
I ' m работает numpy версия 1.17.3, установка Anaconda Python 3.7.3 на MacOS
import numpy as np
n_max = 3
for n in range(1, n_max+1):
seq = np.arange(n, -n-1, -1, dtype=int)
p0 = np.hstack((seq, (n-1)*[-n], seq[::-1], (n-1)*[n]))
print('n: ', n)
print('seq: ', seq)
print('p0: ', p0.dtype, p0)
print('')
возвращает
n: 1
seq: [ 1 0 -1]
p0: float64 [ 1. 0. -1. -1. 0. 1.]
n: 2
seq: [ 2 1 0 -1 -2]
p0: int64 [ 2 1 0 -1 -2 -2 -2 -1 0 1 2 2]
n: 3
seq: [ 3 2 1 0 -1 -2 -3]
p0: int64 [ 3 2 1 0 -1 -2 -3 -3 -3 -3 -2 -1 0 1 2 3 3 3]
Это ожидаемое поведение?
обновление 1: хорошо np.hstack(([1, 0, -1], 1*[7]))
возвращает int64
, но np.hstack(([1, 0, -1], 0*[7]))
возвращает float64
, так что это 0*[n]
в кортеже, на котором работает np.hstack
это вызывает повышение до float64
.
обновление 2: Только что спросили в Code Review: Есть ли лучший, более чистый или иным образом "менее хитрый" способ получить эти гексагональные массивы точек, расположенных в этой спирали?