Питон Триангуляция Делоне - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть массив с различными векторами, которые представляют точки. То, что я пытаюсь получить, это все соседи из каждой точки. Эти точки находятся в «numpy.ndarray» и имеют тип «numpy.float64». Я хочу использовать триангуляцию Делоне, но моя проблема в том, что я использую numpy.float64 в своих массивах, а не целое число. То, что я уже узнал, это так:

from scipy.spatial import Delaunay
import numpy as np

points = np.array([[-0.30352158,  0.73558974,  0.60562561],
      [ 0.46504451, -0.4754239,   0.74679697],
      [-0.52149363,  0.11833734, -0.84500927],
      [ 0.11225645,  0.80278751, -0.58560285],
      [-0.72246172,  0.57197704,  0.38844732],
      [ 0.89957812, -0.07875899, -0.42960008],
      [-0.4316689,  -0.20747224,  0.87784807],
      [-0.19440343,  0.55628405, -0.80793277]])

tri = Delaunay(points)

neighbor_cell = []

for i in range(len(points)):
    neighbor = tri.vertex_neighbor_vertices[1][
           tri.vertex_neighbor_vertices[0][i]:tri.vertex_neighbor_vertices[0][i + 1]]  #from stack overflow
    neighbor_cell.append(points[neighbor])

Чего я не понимаю, так это того, что с приведенными выше списками (points и dir_vec) это работает, но когда я использую его в моем реальном коде, это не работает. В моем собственном коде я извлекаю точки из 3D-изображения и помещаю точки в список. Список такой же, как список «точек» только с большим количеством записей. Поэтому я попытался получить соседей первых 8 записей (код, показанный выше), прежде чем поместить его в мой основной код. Когда я пробую это в моем коде, я получаю эту ошибку:

"Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_bundle/pydev_umd.py", line 197, in runfile
pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "/Users/.../PycharmProjects/.../Code.py", line 80, in <module>
neighborPoints(convertCells())
  File "/Users/.../PycharmProjects/.../Code.py", line 71, in neighborPoints
neighbor_cells.append(cells2[neighbor])
TypeError: only integer scalar arrays can be converted to a scalar index"

Я не понимаю, почему вышеприведенный код работает, но в моем реальном коде это не так. Мой фактический код:

import _pickle as cPickle
from Cell import *
from scipy.spatial import Delaunay

def load(pick):

    with open(pick, 'rb') as input:
        cells = cPickle.load(input, encoding='latin1')
        coms = cPickle.load(input, encoding='latin1')
        point_tree = cPickle.load(input, encoding='bytes')
        print("cPickled loaded")
        return cells, coms, point_tree 

cells, coms, point_tree = load("...")

def convertCells():
# Converts Cells from Cell.Cell to np.array

    cells2 = []
    for i in range(len(cells)):
        cells2.append(cells[i].getMainDir())

    return cells2

def neighborPoints(cells2):

    tri = Delaunay(cells2)

    neighbor_cells = [] # local vector
    help_func = []
    neighbor_cell_dir = []  # directional vector

    for i in range(len(cells2)):
        neighbor = tri.vertex_neighbor_vertices[1][
               tri.vertex_neighbor_vertices[0][i]:tri.vertex_neighbor_vertices[0][i+1]]
        neighbor_cells.append(cells2[neighbor])
        help_func.append(neighbor)

    for i in help_func:
        neighbor_cell_dir.append(coms[i])

    return neighbor_cells, neighbor_cell_dir

Первые 8 записей в ячейках2 такие же, как в точках. Это получается, если я печатаю тип ячейки2, а затем первые 8 записей:

print(type(cell2))
for i in range(8):
    print(cells2[i])

Я получаю этот вывод:

<class 'numpy.ndarray'> 
[[-0.30352158 0.73558974 0.60562561] 
[ 0.46504451 -0.4754239 0.74679697] 
[-0.52149363 0.11833734 -0.84500927] 
[ 0.11225645 0.80278751 -0.58560285] 
[-0.72246172 0.57197704 0.38844732] 
[ 0.89957812 -0.07875899 -0.42960008] 
[-0.4316689 -0.20747224 0.87784807] 
[-0.19440343 0.55628405 -0.80793277]]

Я хочу, чтобы все соседние точки были в новом списке, чтобы я мог проанализировать их дальше. У кого-нибудь есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 16 ноября 2018

Как вы указали в комментариях, cells2 - это список, а не пустой массив.Индексные массивы не работают для списков, вам нужен массив numpy.

Может быть, это работает:

def convertCells(cells):
    cells2 = np.array(len(cells),3)
    for i in range(len(cells)):
        cells2[i,:] = cells[i].getMainDir()
    return cells2

Или просто попробуйте:

cells2 = np.asarray(cells2)

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

...