Мне нравятся вышеупомянутые решения, но у них есть недостаток, который вам нужно отслеживать диапазоны и средства по всем вашим данным. Это может быть громоздким, если у вас есть несколько наборов данных, которые будут отображаться вместе. Чтобы исправить это, я использовал методы ax.get_ [xyz] lim3d () и поместил все это в отдельную функцию, которую можно вызвать только один раз, прежде чем вы вызовете plt.show (). Вот новая версия:
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
def set_axes_equal(ax):
'''Make axes of 3D plot have equal scale so that spheres appear as spheres,
cubes as cubes, etc.. This is one possible solution to Matplotlib's
ax.set_aspect('equal') and ax.axis('equal') not working for 3D.
Input
ax: a matplotlib axis, e.g., as output from plt.gca().
'''
x_limits = ax.get_xlim3d()
y_limits = ax.get_ylim3d()
z_limits = ax.get_zlim3d()
x_range = abs(x_limits[1] - x_limits[0])
x_middle = np.mean(x_limits)
y_range = abs(y_limits[1] - y_limits[0])
y_middle = np.mean(y_limits)
z_range = abs(z_limits[1] - z_limits[0])
z_middle = np.mean(z_limits)
# The plot bounding box is a sphere in the sense of the infinity
# norm, hence I call half the max range the plot radius.
plot_radius = 0.5*max([x_range, y_range, z_range])
ax.set_xlim3d([x_middle - plot_radius, x_middle + plot_radius])
ax.set_ylim3d([y_middle - plot_radius, y_middle + plot_radius])
ax.set_zlim3d([z_middle - plot_radius, z_middle + plot_radius])
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect('equal')
X = np.random.rand(100)*10+5
Y = np.random.rand(100)*5+2.5
Z = np.random.rand(100)*50+25
scat = ax.scatter(X, Y, Z)
set_axes_equal(ax)
plt.show()
Существует несколько различий между [1 116] HashMap
и Hashtable
в Java:
Hashtable
, синхронизировался , тогда как HashMap
не. Это делает HashMap
лучше для нерезьбовых приложений, поскольку несинхронизируемые Объекты обычно работают лучше, чем синхронизируемые.
Hashtable
не позволяет null
ключи или значения. HashMap
позволяет один null
ключ и любое количество null
значения.
Один из подклассов HashMap LinkedHashMap
, поэтому если Вы хотели бы предсказуемый итеративный порядок (который является порядком вставки по умолчанию), Вы могли легко выгрузить HashMap
для LinkedHashMap
. Это не было бы столь же легко, если бы Вы использовали Hashtable
.
, Так как синхронизация не является проблемой для Вас, я рекомендовал бы HashMap
. Если синхронизация становится проблемой, можно также посмотреть ConcurrentHashMap
.
Для потоковых приложений можно часто сходить с рук ConcurrentHashMap-, зависит от требований к производительности.
На основе информации здесь , я рекомендовал бы идти с HashMap. Я думаю, что самое большое преимущество состоит в том, что Java будет препятствовать тому, чтобы Вы изменили его, в то время как Вы выполняете итерации по нему, если Вы не делаете это через итератор.
Hashtable
подобно HashMap
и имеет подобный интерфейс. Рекомендуется использовать HashMap
, если Вы не требуете поддержки унаследованных приложений, или Вам нужна синхронизация, как эти Hashtables
, методы синхронизируются. Таким образом в Вашем случае, поскольку Вы не многопоточность, HashMaps
, Ваш лучший выбор.
i++
isn' t lvalue, не ++i
. (Хотя это doesn' t работают так или иначе),
– Stephen Canon
2 October 2009 в 18:32
Хеш-таблица синхронизируется, тогда как HashMap не. Это делает Хеш-таблицу медленнее, чем Hashmap.
Для нерезьбовых приложений, используйте HashMap, так как они - иначе то же с точки зрения функциональности.
В дополнение к тому, что сказанный izb, HashMap
позволяет нулевым значениям, тогда как эти Hashtable
не делает.
Также примечание, которое Hashtable
расширяется Dictionary
класс, который как состояние Javadocs, является устаревшим и было заменено эти Map
интерфейс.
HashMap
: реализация эти Map
интерфейс, который использует хэш-коды для индексации массива. Hashtable
: Привет, 1998 названный. Они хотят свой API наборов назад.
Серьезно, хотя, Вы более обеспечены избегающий Hashtable
в целом. Для однопоточных приложений Вам не нужны дополнительные издержки синхронизации. Для очень параллельных приложений параноидальная синхронизация могла бы привести к исчерпанию ресурсов, мертвым блокировкам или ненужным паузам сборки "мусора". Как Tim Howland, на которого указывают, Вы могли бы использовать ConcurrentHashMap
вместо этого.
Обратите внимание на то, что много ответов указывает, что Хеш-таблица синхронизируется. На практике это покупает Вас очень мало. синхронизация находится на средстве доступа / мутаторные методы остановят два добавления потоков или удаление из карты одновременно, но в реальном мире Вам часто будет нужна дополнительная синхронизация.
А очень общая идиома должна "проверить тогда помещенный" — т.е. искать запись в эти Map
и добавить его, если это уже не существует. Это ни в коем случае не атомарная операция, используете ли Вы Hashtable
или HashMap
.
эквивалентно синхронизируемый HashMap
может быть получен:
Collections.synchronizedMap(myMap);
, Но правильно реализовать эту логику Вам нужно дополнительная синхронизация из формы:
synchronized(myMap) {
if (!myMap.containsKey("tomato"))
myMap.put("tomato", "red");
}
Даже итерация по Hashtable
записи (или HashMap
полученный Collections.synchronizedMap
) не ориентированы на многопотоковое исполнение, если Вы также не охраняете Map
от того, чтобы быть измененным до дополнительной синхронизации.
Реализации ConcurrentMap
интерфейс (например ConcurrentHashMap
) решают часть этого включением ориентированная на многопотоковое исполнение check-then-act семантика , такая как:
ConcurrentMap.putIfAbsent(key, value);
Хеш-таблица
считается устаревшим кодом. В Hashtable
нет ничего, что нельзя было бы сделать с помощью HashMap
или производных от HashMap
, поэтому для нового кода я не вижу никаких оснований для возврата по Hashtable
.