任何人都可以建议一种快速,有效的存储和访问稀疏八叉树的方法吗?
优选地,可以在HLSL中容易地实现.(我正在使用光线投射/体素应用)
在这种情况下,树可以预先计算,所以我主要关心的是大小和搜索时间.
更新
对于任何想要这样做的人来说,更有效的解决方案可能是将节点存储为使用Z阶曲线/ Morton树生成的线性八叉树.这样做可以消除内部节点的存储,但可能需要使用第二个"数据纹理"交叉引用线性树阵列,其中包含有关单个体素的信息.
我有一个稀疏数组a(大多数为零):
unsigned char a[1000000];
Run Code Online (Sandbox Code Playgroud)
我想b在a使用AVX2的Intel x64架构上使用SIMD指令的非零元素创建一个索引数组.我正在寻找有效如何做到的提示.具体来说,是否有SIMD指令来获取SIMD寄存器中连续非零元素的位置,是否连续排列?
在SparseArray上调用remove()或delete()之间的主要区别是什么,因为它们都接受key作为参数.谢谢.
我在javascript中有一个对象数组.我用jquery.
我如何获得数组中的第一个元素?我不能使用数组索引 - 因为我在将对象添加到数组时分配每个元素索引.因此索引不是0,1,2等.
只需要获取数组的第一个元素?
我是python的新手,来自matlab.我有一个以matlab v7.3(HDF5)格式保存的大型稀疏矩阵.到目前为止,我已经找到了两种加载文件的方法,使用h5py和tables.然而,在矩阵上运行似乎非常缓慢.例如,在matlab中:
>> whos
Name Size Bytes Class Attributes
M 11337x133338 77124408 double sparse
>> tic, sum(M(:)); toc
Elapsed time is 0.086233 seconds.
Run Code Online (Sandbox Code Playgroud)
使用表格:
t = time.time()
sum(f.root.M.data)
elapsed = time.time() - t
print elapsed
35.929461956
Run Code Online (Sandbox Code Playgroud)
使用h5py:
t = time.time()
sum(f["M"]["data"])
elapsed = time.time() - t
print elapsed
Run Code Online (Sandbox Code Playgroud)
(我放弃了等待......)
[编辑]
根据@bpgergo的评论,我应该补充说我已经尝试通过以下两种方式将by h5py(f)中加载的结果转换为numpy数组或scipy稀疏数组:
from scipy import sparse
A = sparse.csc_matrix((f["M"]["data"], f["M"]["ir"], f["tfidf"]["jc"]))
Run Code Online (Sandbox Code Playgroud)
要么
data = numpy.asarray(f["M"]["data"])
ir = numpy.asarray(f["M"]["ir"])
jc …Run Code Online (Sandbox Code Playgroud) 我有一个SparseArray<myObject>并希望将它存储onSaveInstanceState在我的活动中的方法包中并将其恢复oncreate.我找到putSparseParcelableArray了将SparseArray放入bundle中的onSaveInstanceState方法,并在方法中执行了此操作:
bundle.putSparseParcelableArray("mySparseArray", mySparseArray);
Run Code Online (Sandbox Code Playgroud)
但是eclips显示了这个错误:
The method putSparseParcelableArray(String, SparseArray<? extends Parcelable>) in the type Bundle is not applicable for the arguments (String, SparseArray<myObject>)
Run Code Online (Sandbox Code Playgroud)
快速解决方法是将参数转换mySparsArray为SparseArray<? extends Parcelable>,但如果我这样做并在onCreate方法中获取它:
mySparseArray = (SparseArray<myObject>) savedInstanceState.getSparseParcelableArray("mySparseArray");
Run Code Online (Sandbox Code Playgroud)
它收到此错误:
Cannot cast from SparseArray<Parcelable> to SparseArray<myObject>
Run Code Online (Sandbox Code Playgroud)
如果这种方式出错了,将mySparseArray放入bundle中的解决方案是什么?任何帮助将非常感激.
我发现数据帧的稀疏版本在保存到磁盘时实际上比密集版本大得多.我究竟做错了什么?
test = pd.DataFrame(ones((4,4000)))
test.ix[:,:] = nan
test.ix[0,0] = 47
test.to_hdf('test3', 'df')
test.to_sparse(fill_value=nan).to_hdf('test4', 'df')
test.to_pickle('test5')
test.to_sparse(fill_value=nan).to_pickle('test6')
....
ls -sh test*
200K test3 16M test4 164K test5 516K test6
Run Code Online (Sandbox Code Playgroud)
使用版本0.12.0
我最终希望有效地存储10 ^ 7个60个阵列,密度大约为10%,然后将它们拉入Pandas数据帧并使用它们.
编辑:感谢Jeff回答原始问题.后续问题:这似乎只能节省酸洗费用,而不是使用其他格式如HDF5.酸洗我最好的路线?
print shape(array_activity) #This is just 0s and 1s
(1020000, 60)
test = pd.DataFrame(array_activity)
test_sparse = test.to_sparse()
print test_sparse.density
0.0832333496732
test.to_hdf('1', 'df')
test_sparse.to_hdf('2', 'df')
test.to_pickle('3')
test_sparse.to_pickle('4')
!ls -sh 1 2 3 4
477M 1 544M 2 477M 3 83M 4
Run Code Online (Sandbox Code Playgroud)
这是一个数据,作为Matlab .mat文件中的索引列表,小于12M.我很想把它变成HDF5/Pytables格式,这样我就可以抓住特定的索引(其他文件要大得多,加载到内存中需要更长的时间),然后随便做一些Pandasy的事情.也许我不会以正确的方式解决这个问题?
我有一个稀疏的值数组,我想在Spinner中填充,当选择该项时,我想获取id(这是稀疏数组中的键).
从SparseArray创建适配器的首选方法是什么?
是否可以将现有的适配器(如BaseAdapter或ListAdapter)子类化,以便项目具有SparseArray中的项目ID作为项目ID?
不知道如何实现上述目标,我正在考虑创建一个简单的ArrayAdapter实例,并将其作为源从SparseArray中提供,并在选择项目时,通过值查找键,我认为不会高效.
android sparse-array android-listview android-adapter android-spinner
我知道 HashMap 和 SparseArray 都不是线程安全的。如果我有一个中央数据存储库作为 HashMap 可以被活动访问,并且可能被 AsyncTask 访问,我是否必须担心?
为了安全起见,建议使用 HashTable 或更好的 ConcurrentHashMap 吗?
multithreading android hashmap sparse-array concurrenthashmap
我写了一个小程序,生成数组,运行时间很长(几乎永远;-)):
var results = [];
var i = 1;
while (true) {
console.log(i++);
results.push([]);
}
Run Code Online (Sandbox Code Playgroud)
当我创建一个长度稀疏的数组而不是空数组时,i程序崩溃得非常快:
var results = [];
var i = 1;
while (true) {
console.log(i);
results.push(new Array(i++));
}
Run Code Online (Sandbox Code Playgroud)
实际上我起床i等于17424,然后我收到一条错误消息告诉我
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
Abort trap: 6
Run Code Online (Sandbox Code Playgroud)
和Node.js带我回到控制台.由于唯一的区别是第二个产生比前一个更大的"空"数组,这意味着一个空的稀疏长度数组n占用了n具有长度的空数组的空间1.
我是对的(特别是Node.js)吗?
还有一个问题:如果我跑了
var results = [];
var i = 1;
while (true) {
console.log(i);
var temp = [];
temp[i++] = i;
results.push(temp);
}
Run Code Online (Sandbox Code Playgroud)
然后我起床到1286175,然后再次崩溃: …